(57)【特許請求の範囲】
【請求項１】
データの更新処理の要求と、当該更新処理の優先度を示す優先度とを受信する受信部と、
前記データを記憶する他のストレージ装置へ、前記更新処理の要求と前記優先度とを転送する転送部と、
前記更新処理の要求を受信した場合は、当該更新処理の実行を待機し、前記他のストレージ装置から前記データの更新を行った旨の応答をさらに受信した場合は、前記待機させた更新処理を実行する処理部と、
前記受信部が新たに更新処理の要求と前記優先度とを受信した際に、前記処理部が他の更新処理の実行を待機している場合には、当該新たに受信した優先度が、待機中の更新処理の優先度よりも高いか否かを判別する判別部と、
を有し、
前記処理部は、前記判別部が、前記新たに受信した優先度が前記待機中の更新処理の優先度よりも高いと判別した場合には、前記待機中の更新処理の実行をキャンセルし、
前記転送部は、前記判別部が、前記新たに受信した優先度が前記待機中の更新処理の優先度よりも高いと判別した場合には、前記データを記憶する他のストレージ装置へ、前記新たに受信した更新処理の要求と前記新たに受信した優先度とを転送する
ことを特徴とするストレージ装置。
【請求項２】
前記転送部は、前記判別部が、前記新たに受信した優先度が前記待機中の更新処理の優先度よりも低いと判別した場合には、前記新たに受信した要求の送信元に対して、前記更新処理が失敗した旨の応答を送信することを特徴とする請求項１に記載のストレージ装置。
【請求項３】
前記処理部は、前記更新処理の要求と前記優先度とを転送したストレージ装置から前記更新処理が失敗した旨の通知を受信した場合には、当該更新処理の実行をキャンセルし、
前記転送部は、前記処理部が実行をキャンセルした更新処理の要求の送信元に対して、当該更新処理が失敗した旨の通知を転送することを特徴とする請求項２に記載のストレージ装置。
【請求項４】
前記データを記憶する複数のストレージ装置を接続した経路を示す経路情報を記憶する経路記憶部をさらに有し、
前記転送部は、クライアントから受信した前記更新処理の要求と前記優先度とを転送する場合には、当該更新処理の要求と当該優先度とともに前記経路情報を転送し、前記他のストレージ装置から受信した前記更新処理の要求と前記優先度と前記経路情報とを転送する場合には、当該経路情報が示す経路に従って、当該更新処理の要求と当該優先度と当該経路情報とを転送することを特徴とする請求項１〜３のいずれか１つに記載のストレージ装置。
【請求項５】
前記転送部は、前記更新処理の要求を転送した全てのストレージ装置から当該更新処理が完了した旨の応答を受信した場合には、前記待機中の更新処理を実行するとともに、当該更新処理の要求の送信元へ、当該更新処理が完了した旨の応答を転送することを特徴とする請求項４に記載のストレージ装置。
【請求項６】
前記転送部は、前記処理部が実行をキャンセルした更新処理について、他のストレージ装置から当該更新処理が完了した旨の応答を受信した場合には、当該更新処理の要求の送信元へ、当該更新処理が失敗した旨の応答を送信することを特徴とする請求項４または５に記載のストレージ装置。
【請求項７】
前記受信部は、クライアントが前記更新処理の要求を発行した時刻を前記優先度として受信し、
前記判別部は、前記新たに受信した時刻が、前記待機中の更新処理の要求とともに受信した時刻よりも古い時刻を示す場合には、当該新たに受信した優先度が、前記待機中の更新処理の優先度よりも高いと判別することを特徴とする請求項１〜６のいずれか１つに記載のストレージ装置。
【請求項８】
データの更新処理を要求する更新要求と当該更新処理の優先度を示す優先度とを受信した場合には、当該更新処理を実行するストレージ装置が実行するストレージ制御プログラムであって、
前記データを記憶する他のストレージ装置へ、前記更新処理の要求と前記優先度とを転送し、
前記更新処理の要求を受信した場合は、当該更新処理の実行を待機し、前記他のストレージ装置から前記データの更新を行った旨の応答をさらに受信した場合は、前記待機させた更新処理を実行し、
新たに更新処理の要求と前記優先度とを受信した際に、他の更新処理の実行を待機している場合には、当該新たに受信した優先度が、待機中の更新処理の優先度よりも高いか否かを判別し、
前記新たに受信した優先度が前記待機中の更新処理の優先度よりも高いと判別した場合には、前記待機中の更新処理の実行をキャンセルし、
前記新たに受信した優先度が前記待機中の更新処理の優先度よりも高いと判別した場合には、前記データを記憶する他のストレージ装置へ、前記新たに受信した更新処理の要求と前記新たに受信した優先度とを転送する
処理を前記ストレージ装置に実行させることを特徴とするストレージ制御プログラム。
【請求項９】
データの更新処理を要求する更新要求と当該更新処理の優先度を示す優先度とを受信した場合には、当該更新処理を実行するストレージ装置が実行するストレージ制御方法であって、
前記データを記憶する他のストレージ装置へ、前記更新処理の要求と前記優先度とを転送し、
前記更新処理の要求を受信した場合は、当該更新処理の実行を待機し、前記他のストレージ装置から前記データの更新を行った旨の応答をさらに受信した場合は、前記待機させた更新処理を実行し、
新たに更新処理の要求と前記優先度とを受信した際に、他の更新処理の実行を待機している場合には、当該新たに受信した優先度が、待機中の更新処理の優先度よりも高いか否かを判別し、
前記新たに受信した優先度が前記待機中の更新処理の優先度よりも高いと判別した場合には、前記待機中の更新処理の実行をキャンセルし、
前記新たに受信した優先度が前記待機中の更新処理の優先度よりも高いと判別した場合には、前記データを記憶する他のストレージ装置へ、前記新たに受信した更新処理の要求と前記新たに受信した優先度とを転送する
処理を実行することを特徴とするストレージ制御方法。 
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、ストレージ装置、ストレージ制御プログラムおよびストレージ制御方法に関する。
【背景技術】
【０００２】
従来、分散ＫＶＳ（Key-Value  Store）等のＮｏＳＱＬを初めとするストレージシステムにおいて、データの複製であるレプリカを複数のノードに配置する技術が知られている。このような技術が適用されたストレージシステムは、レプリカを複数のノードに配置することで、ディスク故障などによるデータの消失を防ぐとともに、各ノードに配置されたレプリカからデータの読出しを許可することで、アクセスの負荷分散を行う。
【０００３】
ここで、ストレージシステムは、各レプリカから読み出されるデータの同一性を保証するＳｔｒｏｎｇ  Ｃｏｎｓｉｓｔｅｎｃｙが要求される場合がある。このようなＳｔｒｏｎｇ  Ｃｏｎｓｉｓｔｅｎｃｙを保つ手法の一例として、チェインレプリケーションの技術が知られている。このようなチェインレプリケーションが適用されたストレージシステムの一例について以下に説明する。
【０００４】
まず、図２１を用いて、クライアントがＰｕｔ要求を発行した際にストレージシステムが実行する処理の一例について説明する。図２１は、チェインレプリケーションの一例について説明するための図である。なお、図２１に示す例では、チェインレプリケーションの一例としてＣＲＡＱ（Ｃｈａｉｎ  Ｒｅｐｌｉｃａｔｉｏｎ  ｗｉｔｈ  Ａｐｐｏｒｔｉｏｎｅｄ  Ｑｕｅｒｙ）が適用されたストレージシステムについて説明する。
【０００５】
図２１に示す例では、ストレージシステムは、同一のレプリカを有するＮ個のノードを有する。なお、図２１に示す例では、ストレージシステムは、Ｎ個のノードのうち、１ｓｔノード、２ｎｄノード、３ｒｄノード、Ｎｔｈノード以外のノードについては、図示を省略している。
【０００６】
このようなストレージシステムが有する各ノードは、クライアントがＰｕｔ要求を発行した場合には、各ノードを順に並べた経路に沿って、データの書込みを要求するｕｐｄａｔｅ要求を順次転送する。例えば、図２１に示す例では、ストレージシステムは、経路の始端となる１ｓｔノードをＰｕｔ要求の発行先として指定する。このような場合には、図２１中（Ａ）に示すように、クライアントは、Ｐｕｔ要求を経路の始端となる１ｓｔノードに発行する。
【０００７】
１ｓｔノードは、Ｐｕｔ要求を受信した場合には、新たなデータの書込みを準備するとともに、図２１中（Ｂ）に示すように、２ｎｄノードにｕｐｄａｔｅ要求を送信する。また、２ｎｄノードは、１ｓｔノードからｕｐｄａｔｅ要求を受信した場合には、新たなデータの書込みを準備するとともに、ｕｐｄａｔｅ要求を３ｒｄノードに転送する。
【０００８】
その後、各ノードは、ｕｐｄａｔｅ要求を経路の終端となるＮｔｈノードまで順に転送する。また、図２１中（Ｃ）に示すように、経路の終端となるＮｔｈノードは、ｕｐｄａｔｅ要求を受信した場合には、新たなデータを書込むとともに、ｕｐｄａｔｅ要求に対する応答であるｕｐｄａｔｅｄ要求を経路の１つ前のノードに送信する。
【０００９】
その後、各ノードは、ｕｐｄａｔｅｄ要求を受信した場合は、準備したデータの書込みを実行するとともに、ｕｐｄａｔｅｄ要求を経路に沿って、始端となる１ｓｔノードまで順に転送する。そして、１ｓｔノードは、図２１中（Ｄ）に示すように、ｕｐｄａｔｅｄ要求を受信した場合には、準備したデータの書込みを実行し、書込み処理が終了した旨をクライアントに通知する。
【先行技術文献】
【非特許文献】
【００１０】
【非特許文献１】Object  Storage  on  CRAQ,  High-throughput  chain  replication  for  read-mostly  workloads,  Jeff  Terrace  and  Michael  J.Freedman  Princeton  University,  USENIX  annual  Technical  Conference.San  Diego,  CA,  June  2009.
【非特許文献２】Chain  Replication  for  Supporting  High  Throughput  and  Availability,  Robbert  van  Renesse,  Fred  B.Schneider,  USENIX  Association  OSDI’04:6th  Symposium  on  Peration  Systems  Design  and  Implementation.
【発明の概要】
【発明が解決しようとする課題】
【００１１】
しかし、上述したチェインレプリケーションの技術では、Ｐｕｔ要求の発行先となるノードが予め決められており、任意のノードにＰｕｔ要求を発行することができないという問題がある。このため、ノードの設置位置が分散されたストレージシステムにおいては、複数のクライアントにより発行されたＰｕｔ要求に対する処理が公平に実行されない。
【００１２】
図２２は、Ｐｕｔ要求に対する処理を実行するタイミングを説明するための図である。図２２に示す例では、クライアント８ａと１ｓｔノードがデータセンター＃１に設置され、クライアント８ｂがデータセンター＃２に設置される。また、図２２に示す例では、ネットワーク遅延により、クライアント８ａが発行したＰｕｔ要求は、発行されてから２ミリ秒後に１ｓｔノードに到着し、クライアント８ｂが発行したＰｕｔ要求は、発行されてから２５ミリ秒後に１ｓｔノードに到着する。
【００１３】
ここで、クライアント８ｂがＰｕｔ要求を発行してから１０ミリ秒後に、クライアント８ａがＰｕｔ要求を発行したとする。このような場合には、１ｓｔノードは、図２２中（Ｅ）に示すようにクライアント８ａが発行したＰｕｔ要求を先に受信する。その後、図２２中（Ｆ）に示すように、クライアント８ｂが発行したＰｕｔ要求を受信する。このため、１ｓｔノードは、クライアント８ａが後から発行したＰｕｔ要求を、クライアント８ｂが先に発行したＰｕｔ要求よりも先に実行してしまう。
【００１４】
本願は、１つの側面では、どのノードに発行されたＰｕｔ要求も適切に実行する。
【課題を解決するための手段】
【００１５】
１つの側面では、データの更新処理の要求と、更新処理の優先度を示す優先度とを受信するストレージ装置である。ストレージ装置は、データを記憶する他のストレージ装置へ、更新処理の要求と優先度とを転送する。また、ストレージ装置は、更新処理の要求を受信した場合は、更新処理の実行を待機し、他のストレージ装置からデータの更新を行った旨の応答をさらに受信した場合は、待機させた更新処理を実行する。また、ストレージ装置は、新たに更新処理の要求と優先度とを受信した際に、他の更新処理の実行を待機している場合には、新たに受信した優先度が、待機中の更新処理の優先度よりも高いか否かを判別する。そして、ストレージ装置は、新たに受信した優先度が待機中の更新処理の優先度よりも高いと判別した場合には、待機中の更新処理の実行をキャンセルする。また、ストレージ装置は、新たに受信した優先度が待機中の更新処理の優先度よりも高いと判別した場合には、データを記憶する他のストレージ装置へ、新たに受信した更新処理の要求と新たに受信した優先度とを転送する。
【発明の効果】
【００１６】
１つの側面では、どのノードに発行されたＰｕｔ要求も適切に実行する。
【図面の簡単な説明】
【００１７】
【図１】図１は、実施例１に係るストレージシステムを説明するための図である。
【図２】図２は、実施例１に係るノードの機能構成を説明するための図である。
【図３】図３は、状態管理表の一例を説明するための図である。
【図４】図４は、実施例１に係るストレージシステムが実行する処理を説明するための図である。
【図５】図５は、実施例１に係るノードがＰｕｔ要求を受信した際に実行する処理の流れを説明するための第１の図である。
【図６】図６は、実施例１に係るノードがＰｕｔ要求を受信した際に実行する処理の流れを説明するための第２の図である。
【図７】図７は、実施例１に係る状態更新処理の流れについて説明するためのフローチャートである。
【図８】図８は、実施例１に係る更新失敗通知処理の流れについて説明するためのフローチャートである。
【図９】図９は、実施例１に係る更新完了通知処理の流れについて説明するためのフローチャートである。
【図１０】図１０は、更新失敗通知を取得した際に実行する処理の流れを説明するための第１のフローチャートである。
【図１１】図１１は、更新失敗通知を取得した際に実行する処理の流れを説明するための第２のフローチャートである。
【図１２】図１２は、更新完了通知を取得した際に実行する処理の流れを説明するための第１のフローチャートである。
【図１３】図１３は、更新完了通知を取得した際に実行する処理の流れを説明するための第２のフローチャートである。
【図１４】図１４は、更新完了通知を取得した際に実行する処理の流れを説明するための第３のフローチャートである。
【図１５】図１５は、実施例２に係るノードの機能構成を説明するための図である。
【図１６】図１６は、実施例２に係る状態管理表を説明するための図である。
【図１７】図１７は、実施例２に係る更新失敗通知部が更新失敗通知を取得した際に実行する処理の流れを説明するためのフローチャートである。
【図１８】図１８は、実施例２に係る更新完了通知部が更新完了通知を取得した際に実行する処理の流れを説明するための第１のフローチャートである。
【図１９】図１９は、実施例２に係る更新完了通知部が更新完了通知を取得した際に実行する処理の流れを説明するための第２のフローチャートである。
【図２０】図２０は、ストレージ制御プログラムを実行するコンピュータの一例を説明するための図である。
【図２１】図２１は、チェインレプリケーションの一例について説明するための図である。
【図２２】図２２は、Ｐｕｔ要求に対する処理を実行するタイミングを説明するための図である。
【発明を実施するための形態】
【００１８】
以下に添付図面を参照して本願に係るストレージ装置、ストレージ制御プログラムおよびストレージ制御方法について説明する。
【実施例１】
【００１９】
以下の実施例１では、図１を用いて、ストレージシステムの一例を説明する。図１は、実施例１に係るストレージシステムを説明するための図である。なお、以下の説明において、ノードとは、例えば、データの複製であるレプリカを記憶する記憶装置と、他のノードとの通信処理、データの更新処理、データの管理処理等を実行する演算処理装置とを有するストレージ装置やサーバ等が適用されるものとする。
【００２０】
図１に示す例では、ストレージシステム１は、複数のクライアント２、３を有する。また、ストレージシステム１は、複数のノード４〜７を有する。各ノード４〜７は、それぞれ、同一のデータの複製である１ｓｔレプリカから４ｔｈレプリカを記憶する。図１に示す例では、ノード４は、１ｓｔレプリカを記憶する。また、ノード５は、２ｎｄレプリカを記憶する。また、ノード６は、３ｒｄレプリカを記憶する。また、ノード７は、４ｔｈレプリカを記憶する。
【００２１】
図１に示す例では、クライアント２、３は、任意のノード４〜７に対して、データの書込み等の更新処理を要求するＰｕｔ要求を発行する。また、クライアント２、３は、Ｐｕｔ要求が示す更新処理の優先度をしめすマーク強度を格納したＰｕｔ要求を発行する。また、クライアント２、３は、データの読出し要求であるＧｅｔ要求を各ノード４〜７に発行する。
【００２２】
例えば、クライアント２、３は、マーク強度、更新操作タグ、データが格納された要求を発行する。ここで、マーク強度とは、要求が示す処理の実行強度、すなわち、要求が示す処理の優先度を示す情報であり、例えば、クライアント２、３が要求を発行した時刻である。また、更新操作タグとは、要求が示す処理内容を示し、例えば、データの書込み処理を示す「Ｐｕｔ」や、データの読出しを示す「Ｇｅｔ」が格納される。
【００２３】
すなわち、更新操作タグに「Ｐｕｔ」が格納された要求がＰｕｔ要求であり、更新操作タグに「Ｇｅｔ」が格納された要求がＧｅｔ要求である。なお、データは、Ｐｕｔ要求のみに格納され、書込み対象となるデータである。なお、クライアント２、３がＧｅｔ要求を発行した際に各ノード４〜７が実行する処理については、従来のストレージシステムが実行する処理と同様の処理を実行するものとして、以下の説明を省略する。
【００２４】
次に、図２を用いて、ノード４について説明する。図２は、実施例１に係るノードの機能構成を説明するための図である。なお、以下の説明においては、ノード５〜７は、ノード４と同様の処理を実行するものとして、説明を省略する。
【００２５】
図２に示す例では、ノード４は、ネットワークインターフェース１０、要求受信部１１、要求処理部１２、データ更新部１７、データ記憶部１８、要求発行部１９を有する。また、ノード４は、クライアント位置記憶部２０、トポロジー計算部２１、ノード間要求並列送信部２２、クライアント位置判断部２３、クライアント要求送信部２４を有する。
【００２６】
また、要求処理部１２は、Ｐｕｔ要求処理部１３、状態更新部１４、更新失敗通知部１５、更新完了通知部１６を有する。また、データ記憶部１８は、１ｓｔレプリカを記憶するとともに、状態管理表１８ａと、ルーティング情報１８ｂとノード情報１８ｃを記憶する。
【００２７】
状態管理表１８ａは、ノード４が準備中の更新処理の内容を示す表である。ここで、図３は、状態管理表の一例を説明するための図である。図３に示す例では、状態管理表１８ａは、準備中の更新処理を示す更新ステータスと、実行をキャンセルした更新処理を示すキャンセル表とを有する。ここで更新ステータスには、マーク強度「ｘ」、親レプリカ「ｙ」、子レプリカ数が格納される。
【００２８】
ここで「ｘ」は、Ｐｕｔ要求をクライアントが発行した時刻である。また、「ｙ」とは、Ｐｕｔ要求の送信元となるクライアント、又は、Ｐｕｔ要求の転送元であるレプリカを示す情報である。
【００２９】
子レプリカ数とは、ノード４がＰｕｔ要求を転送するノードの数を示す情報である。例えば、ノード４がＰｕｔ要求をノード５に転送する場合には、子レプリカ数として「１」が格納され、ノード４がＰｕｔ要求をノード５およびノード６に転送する場合には、子レプリカ数として「２」が格納される。なお、キャンセル表には、実行をキャンセルした更新処理のマーク強度、親レプリカ、子レプリカ数が格納される。
【００３０】
図２に戻って、ルーティング情報１８ｂとは、ノード４がクライアント２、３からＰｕｔ要求を受信した場合に、受信したＰｕｔ要求を転送する経路を示す。例えば、ノード４は、ルーティング情報として、Ｇ１＝（｛レプリカ１，レプリカ２，レプリカ３，レプリカ４｝，｛（レプリカ１，レプリカ２），（レプリカ１，レプリカ３），（レプリカ２，レプリカ４），（レプリカ４，レプリカ３）｝，レプリカ１，レプリカ３）を記憶する。
【００３１】
ここで、ルーティング情報におけるレプリカ１とは１ｓｔレプリカを示し、レプリカ２とは２ｎｄレプリカを示し、レプリカ３とは３ｒｄレプリカを示し、レプリカ４とは４ｔｈレプリカを示す。また、ルーティング情報には、Ｐｕｔ要求の転送先となる全てのレプリカ、Ｐｕｔ要求の転送元となるレプリカと転送先となるレプリカの組の集合、経路の始端となるレプリカ、経路の終端となるレプリカが順に格納される。
【００３２】
すなわち、上述した例では、ルーティング情報であるＧ１は、Ｐｕｔ要求を転送する対象となるレプリカの集合が１ｓｔレプリカから４ｔｈレプリカまでの４つのレプリカである旨を示す。また、Ｇ１は、１ｓｔレプリカを記憶するノードから２ｎｄレプリカを記憶するノードと３ｒｄレプリカを記憶するノードにＰｕｔ要求を転送する旨の転送経路を示す。また、Ｇ１は、２ｎｄレプリカを記憶するノードから４ｔｈレプリカを記憶するノードにＰｕｔ要求を転送し、４ｔｈレプリカを記憶するノードから３ｒｄレプリカを記憶するノードにＰｕｔ要求を転送する旨の転送経路を示す。また、Ｇ１は、Ｐｕｔ要求を転送する経路の始端が１ｓｔレプリカを記憶するノードであり、経路の終端が３ｒｄレプリカを記憶するノードであることを示す。
【００３３】
なお、各ノード４〜７が記憶するルーティング情報は、同一のデータの複製であるレプリカについて、同一のトポロジに対し、それぞれ異なる経路でＰｕｔ要求等を転送するので、それぞれ異なるルーティング情報を記憶することとなる。例えば、３ｒｄレプリカを記憶するノード６は、ルーティング情報としてＧ３＝（｛レプリカ１，レプリカ２，レプリカ３，レプリカ４｝，｛（レプリカ３，レプリカ１），（レプリカ３，レプリカ４），（レプリカ１，レプリカ２），（レプリカ４，レプリカ２）｝，レプリカ３，レプリカ２）を記憶する。
【００３４】
ノード情報１８ｃとは、ノード４が記憶する１ｓｔレプリカと同じデータのレプリカをどのノードが記憶しているかを示す。例えば、ノード情報１８ｃは、２ｎｄレプリカをノード５が記憶し、３ｒｄレプリカをノード６が記憶し、４ｔｈレプリカをノード７が記憶している旨を示す。
【００３５】
ネットワークインターフェース１０は、クライアント２、３及び他のノード５〜７が送信したＰｕｔ要求、更新処理が成功した旨を示す更新完了通知、更新処理が失敗した旨を示す更新失敗通知を受信する。そして、ネットワークインターフェース１０は、受信したＰｕｔ要求、更新完了通知、更新失敗通知を要求受信部１１へ出力する。
【００３６】
また、ネットワークインターフェース１０は、ノード間要求並列送信部２２から、Ｐｕｔ要求、または、更新完了通知、または、更新失敗通知を送信先となるノードの通知とともに取得する。このような場合には、ネットワークインターフェース１０は、通知されたノードへＰｕｔ要求、または、更新完了通知、または、更新失敗通知を送信する。
【００３７】
また、ネットワークインターフェース１０は、クライアント要求送信部２４から更新完了通知、または、更新失敗通知をクライアントのＩＰアドレスと、Ｐｕｔ要求のトランザクションＩＤともに取得する。このような場合には、ネットワークインターフェース１０は、取得したＩＰアドレスを宛先として取得した更新完了通知、または、更新失敗通知を送信する。
【００３８】
要求受信部１１は、ネットワークインターフェース１０からＰｕｔ要求を取得した場合には、Ｐｕｔ要求を解析し、ルーティング情報が格納されているか否かを判別する。そして、要求受信部１１は、ルーティング情報が格納されていない場合には、クライアントが発行したＰｕｔ要求であると判別し、送信元となるクライアントのＩＰアドレスとトランザクションＩＤとをクライアント位置記憶部２０に格納する。また、要求受信部１１は、受信したＰｕｔ要求を要求処理部１２が有するＰｕｔ要求処理部１３に出力する。
【００３９】
一方、要求受信部１１は、取得したＰｕｔ要求にルーティング情報が格納されている場合には、取得したＰｕｔ要求が他のノード５〜７から転送されてきたものであると判別し、Ｐｕｔ要求をＰｕｔ要求処理部１３にそのまま出力する。また、要求受信部１１は、ネットワークインターフェース１０から更新失敗通知を取得した場合には、取得した更新失敗通知を更新失敗通知部１５に出力する。また、要求受信部１１は、更新完了通知を取得した場合には、取得した更新完了通知を更新完了通知部１６に出力する。
【００４０】
要求処理部１２は、Ｐｕｔ要求を取得した際に、他のＰｕｔ要求が示す更新処理を準備中である場合には、新たに取得したＰｕｔ要求に格納されたマーク強度と、準備中の更新処理に係るＰｕｔ要求に格納されていたマーク強度とを比較する。すなわち、Ｐｕｔ要求処理部１３は、新たな更新処理と準備中の更新処理との優先度を比較する。そして、Ｐｕｔ要求処理部１３は、新たな更新処理の優先度が準備中の更新処理の優先度よりも高い場合は、準備中の更新処理をキャンセルするとともに、新たなＰｕｔ要求を他のノード５〜７に転送する。
【００４１】
以下、このような要求処理部１２が有するＰｕｔ要求処理部１３、状態更新部１４、更新失敗通知部１５、更新完了通知部１６が実行する処理について説明する。例えば、Ｐｕｔ要求処理部１３は、Ｐｕｔ要求を取得した場合には、更新処理の対象となるレプリカをデータ記憶部１８から検索する。また、Ｐｕｔ要求処理部１３は、状態管理表１８ａの更新ステータスを参照し、更新処理を準備中であるか否かを判別する。
【００４２】
そして、Ｐｕｔ要求処理部１３は、更新処理を準備中ではないと判別した場合には、Ｐｕｔ要求に格納されたルーティング情報が示す経路において、ノード４が終端となるか否かを判別する。一方、Ｐｕｔ要求処理部１３は、Ｐｕｔ要求にルーティング情報が格納されていない場合、つまり、Ｐｕｔ要求がクライアント２、３から受信したものである場合は、Ｐｕｔ要求の対象となるレプリカのルーティング情報１８ｂをデータ記憶部１８から取得する。そして、Ｐｕｔ要求処理部１３は、ルーティング情報１８ｂが示す経路において、ノード４が終端となるか否かを判別する。
【００４３】
その後、Ｐｕｔ要求処理部１３は、ノード４が終端となると判別した場合には、Ｐｕｔ要求を更新完了通知部１６に出力する。また、Ｐｕｔ要求処理部１３は、ノード４が終端ではないと判別した場合には、Ｐｕｔ要求を状態更新部１４に出力する。
【００４４】
また、Ｐｕｔ要求処理部１３は、更新処理を準備中であると判別した場合には、以下の処理を実行する。すなわち、Ｐｕｔ要求処理部１３は、Ｐｕｔ要求に格納されたルーティング情報、または、Ｐｕｔ要求の対象となるレプリカのルーティング情報１８ｂをデータ記憶部１８から取得し、ノード４が終端となるか否かを判別する。
【００４５】
また、Ｐｕｔ要求処理部１３は、状態管理表１８ａの更新ステータスを参照し、更新ステータスが示すマーク強度と新たに取得したＰｕｔ要求に格納されたマーク強度とを比較する。すなわち、Ｐｕｔ要求処理部１３は、準備中の更新処理の優先度と、新たに取得したＰｕｔ要求の優先度とを比較する。
【００４６】
そして、Ｐｕｔ要求処理部１３は、ノード４が終端ではなく、かつ、新たに取得したＰｕｔ要求の優先度が準備中の更新処理の優先度よりも高いと判別した場合には、状態更新部１４にＰｕｔ要求を出力する。また、Ｐｕｔ要求処理部１３は、ノード４が終端であり、かつ、新たに取得したＰｕｔ要求の優先度が準備中の更新処理の優先度よりも高いと判別した場合には、更新完了通知部１６にＰｕｔ要求を出力する。なお、Ｐｕｔ要求処理部１３は、新たに取得したＰｕｔ要求の優先度が準備中の更新処理の優先度よりも高いと判別した場合には、更新失敗通知部１５にＰｕｔ要求を出力する。
【００４７】
例えば、Ｐｕｔ要求処理部１３は、クライアント２、３がＰｕｔ要求を発行した時刻がマーク強度である際に、より早い時刻が格納されたＰｕｔ要求を優先度が高いと判別する。すなわち、Ｐｕｔ要求処理部１３は、先に発行されたＰｕｔ要求の優先度が、後に発行されたＰｕｔ要求の優先度よりも高いと判別する。
【００４８】
なお、Ｐｕｔ要求処理部１３は、状態更新部１４、更新失敗通知部１５、更新完了通知部１６にＰｕｔ要求を出力する場合には、以下の処理を実行する。すなわち、Ｐｕｔ要求処理部１３は、Ｐｕｔ要求がクライアント２、３から受信したものである場合には、データ記憶部１８から取得したルーティング情報１８ｂをＰｕｔ要求に格納し、ルーティング情報１８ｂを格納したＰｕｔ要求を出力する。つまり、Ｐｕｔ要求処理部１３は、他のノード５〜７が格納したルーティング情報、または、データ記憶部８に記憶されたルーティング情報１８ｂが格納されたＰｕｔ要求を出力する。
【００４９】
また、Ｐｕｔ要求処理部１３は、更新失敗通知を取得した場合には、更新失敗通知を更新失敗通知部１５に出力する。また、Ｐｕｔ要求処理部１３は、更新完了通知を取得した場合には、更新完了通知を更新完了通知部１６に出力する。
【００５０】
状態更新部１４は、Ｐｕｔ要求処理部１３から、Ｐｕｔ要求を取得した場合は、以下の処理を実行する。すなわち、状態更新部１４は、取得したＰｕｔ要求が示す更新処理に合わせて、状態管理表１８ａを更新する。具体的には、状態更新部１４は、状態管理表１８ａに更新ステータスが格納されているか否かを判別する。そして、状態更新部１４は、状態管理表１８ａに更新ステータスが格納されている場合には、更新ステータスの内容をキャンセル表に移動する。
【００５１】
また、状態更新部１４は、取得したＰｕｔ要求からマーク強度とルーティング情報とを取得する。また、状態更新部１４は、取得したルーティング情報を用いて、ノード４にＰｕｔ要求を送信したノード、すなわち、親レプリカを記憶するノードを識別する。なお、状態更新部１４は、取得したルーティング情報に、ノード４が記憶するレプリカが始端として記憶されている場合には、Ｐｕｔ要求を発行したクライアントを識別する。また、状態更新部１４は、取得したルーティング情報を用いて、Ｐｕｔ要求を転送するノードの数、すなわち、子レプリカ数を識別する。
【００５２】
そして、状態更新部１４は、取得したマーク強度、識別した親レプリカまたはクライアント、識別した子レプリカ数を新たな更新ステータスとして状態管理表１８ａに格納する。また、状態更新部１４は、要求発行部１９に対して、Ｐｕｔ要求を出力する。
【００５３】
更新失敗通知部１５は、Ｐｕｔ要求処理部１３からＰｕｔ要求を取得した場合には、以下の処理を実行する。まず、Ｐｕｔ要求処理部１３は、取得したＰｕｔ要求に格納されたルーティング情報を用いて、取得したＰｕｔ要求の送信元が、親レプリカを記憶するノードであるか、クライアントであるか否かを判別する。
【００５４】
そして、更新失敗通知部１５は、取得したＰｕｔ要求の送信元が親レプリカを記憶するノードである場合には、Ｐｕｔ要求の送信元となるノードを識別し、識別したノードに更新失敗通知を送信するよう要求発行部１９に依頼する。この際、更新失敗通知部１５は、Ｐｕｔ要求に格納されていたルーティング情報を要求発行部１９に出力する。
【００５５】
一方、更新失敗通知部１５は、Ｐｕｔ要求の送信元がクライアントである場合には、Ｐｕｔ要求の送信元であるクライアントを識別し、識別したクライアントに更新失敗通知を送信するよう要求発行部１９に依頼する。
【００５６】
また、更新失敗通知部１５は、更新失敗通知を取得した場合には、以下の処理を実行する。まず、後述するように、更新失敗通知には、失敗した更新処理のマーク強度と、失敗した更新処理を要求するＰｕｔ要求に格納されていたルーティング情報とが格納されている。そして、更新失敗通知部１５は、更新失敗通知から、失敗した更新処理のマーク強度を取得し、取得したマーク強度と、更新ステータスのマーク強度とを比較する。
【００５７】
その後、更新失敗通知部１５は、更新失敗通知から取得したマーク強度と更新ステータスのマーク強度とが一致した場合には、以下の処理を実行する。まず、更新失敗通知部１５は、更新ステータスに更新失敗フラグを設定するとともに、更新ステータスの子レプリカ数を１デクリメントする。ここで更新失敗フラグとは、更新ステータスが示す更新処理が失敗した旨を示す任意の情報である。
【００５８】
次に、更新失敗通知部１５は、更新ステータスの子レプリカ数が０であるか否かを判別し、子レプリカ数が０である場合には、更新失敗通知の転送先となるクライアント、または、ノードを識別する。そして、更新失敗通知部１５は、識別したクライアント、または、ノードに対して更新失敗通知を転送するよう要求発行部１９に依頼する。
【００５９】
一方、更新失敗通知部１５は、更新失敗通知から取得したマーク強度と更新ステータスのマーク強度とが一致しなかった場合は、キャンセル表の各エントリを参照し、更新失敗通知から取得したマーク強度と同じマーク強度のエントリを取得する。そして、更新失敗通知部１５は、取得したエントリの子レプリカ数を１デクリメントする。
【００６０】
次に、更新失敗通知部１５は、取得したエントリの子レプリカ数が０となった場合には、エントリを削除する。その後、更新失敗通知部１５は、更新失敗通知の転送先となるクライアント、または、ノードを識別し、識別したクライアント、または、ノードに対して更新失敗通知を転送するよう要求発行部１９に依頼する。なお、更新失敗通知部１５は、更新失敗通知を転送するよう要求発行部１９に依頼する場合には、転送する更新失敗通知を要求発行部１９に出力する。
【００６１】
更新完了通知部１６は、Ｐｕｔ要求処理部１３からＰｕｔ要求を取得した場合には、以下の処理を実行する。すなわち、更新完了通知部１６は、取得したＰｕｔ要求が示す更新処理を実行するようデータ更新部１７に依頼する。そして、更新完了通知部１６は、取得したＰｕｔ要求のルーティング情報を用いて、取得したＰｕｔ要求の送信元が、親レプリカを記憶するノードであるか、クライアントであるか否かを判別する。
【００６２】
そして、更新完了通知部１６は、取得したＰｕｔ要求の送信元が親レプリカを記憶するノードである場合には、Ｐｕｔ要求の送信元となるノードを識別し、識別したノードに更新完了通知を送信するよう要求発行部１９に依頼する。この際、更新完了通知部１６は、Ｐｕｔ要求に格納されていたルーティング情報を要求発行部１９に出力する。
【００６３】
一方、更新完了通知部１６は、取得したＰｕｔ要求の送信元がクライアントである場合には、Ｐｕｔ要求の送信元であるクライアントを識別し、識別したクライアントに更新完了通知を送信するよう要求発行部１９に依頼する。
【００６４】
また、更新完了通知部１６は、Ｐｕｔ要求処理部１３から更新完了通知を取得した場合には、以下の処理を実行する。まず、後述するように、更新完了通知には、更新失敗通知と同様に、実行が完了した更新処理のマーク強度と、実行が完了した更新処理を要求するＰｕｔ要求に格納されていたルーティング情報とが格納されている。そして、更新完了通知部１６は、更新完了通知から、マーク強度とルーティング情報とを取得し、取得したマーク強度と、更新ステータスのマーク強度とを比較する。
【００６５】
そして、更新完了通知部１６は、取得したマーク強度と更新ステータスのマーク強度とが一致する場合には、更新ステータスに更新失敗フラグが設定されているか否かを判別する。また、更新完了通知部１６は、更新失敗フラグが設定されている場合には、更新ステータスの子レプリカ数を１デクリメントする。そして、更新完了通知部１６は、更新ステータスの子レプリカ数が０になった場合には、更新失敗通知を転送するクライアント、または親レプリカを記憶するノードを識別する。その後、更新完了通知部１６は、識別したクライアントまたはノードに更新失敗通知を送信するよう要求発行部１９に依頼する。
【００６６】
また、更新完了通知部１６は、更新ステータスに更新失敗フラグが設定されていない場合には、更新ステータスの子レプリカ数を１デクリメントする。そして、更新完了通知部１６は、更新ステータスの子レプリカ数が０になった場合には、データ更新部１７にレプリカの更新を依頼する。
【００６７】
また、更新完了通知部１６は、更新ステータスをクリアするとともに、更新完了通知の転送先となるクライアント、または、親レプリカを記憶するノードを識別する。その後、更新完了通知部１６は、識別したクライアントまたはノードに更新完了通知を転送するよう要求発行部１９に依頼する。この際、更新完了通知部１６は、他のノードから受信した更新完了通知を要求発行部１９に出力する。
【００６８】
一方、更新完了通知部１６は、更新完了通知から取得したマーク強度と更新ステータスのマーク強度とが一致しなかった場合は、キャンセル表の各エントリを参照し、更新完了通知から取得したマーク強度と同じマーク強度のエントリを取得する。そして、更新完了通知部１６は、取得したエントリの子レプリカ数を１デクリメントする。次に、更新完了通知部１６は、取得したエントリの子レプリカ数が０となった場合には、エントリを削除する。
【００６９】
その後、更新完了通知部１６は、更新失敗通知の転送先となるクライアント、または、ノードを識別し、識別したクライアント、または、ノードに対して更新失敗通知を送信するよう要求発行部１９に依頼する。なお、更新完了通知部１６は、更新失敗通知を送信するよう要求発行部１９に依頼する場合には、他のノードから受信した更新完了通知に格納されているルーティング情報を要求発行部１９に出力する。
【００７０】
このように、更新完了通知部１６は、更新ステータスに更新失敗フラグが設定されている場合には、Ｐｕｔ要求を転送したノードのいずれかに、転送したＰｕｔ要求よりも高い優先度のＰｕｔ要求が送信されており、更新失敗通知を受信済みであると判別する。このため、更新完了通知部１６は、Ｐｕｔ要求を転送した全てのノードから更新完了通知を取得した場合には、レプリカの更新を依頼するとともに、クライアントまたは親レプリカを記憶するノードに更新完了通知を送信する。
【００７１】
また、更新完了通知部１６は、Ｐｕｔ要求を転送したいずれかのノードから更新失敗通知を取得し、かつ、Ｐｕｔ要求を転送した全てのノードから更新完了通知または更新失敗通知を取得した場合には、以下の処理を実行する。すなわち、更新完了通知部１６は、レプリカの更新を依頼せずに、クライアントまたは親レプリカを記憶するノードに更新失敗通知を送信する。また、更新完了通知部１６は、準備中の更新処理をキャンセルした後に、Ｐｕｔ要求を転送したノードから更新完了通知または更新失敗通知を取得した場合には、クライアント、または、親レプリカを記憶するノードに更新失敗通知を送信する。
【００７２】
データ更新部１７は、データ記憶部１８が記憶するレプリカのデータを更新する。具体的には、データ更新部１７は、更新完了通知部１６からレプリカの更新を依頼された場合には、更新ステータスが示す更新処理を実行する。
【００７３】
要求発行部１９は、状態更新部１４からＰｕｔ要求を取得した場合には、Ｐｕｔ要求に格納されたルーティング情報に従って、Ｐｕｔ要求を他のノード５〜７に転送する。具体的には、要求発行部１９は、状態更新部１４から取得したＰｕｔ要求をトポロジー計算部２１に出力する。
【００７４】
また、要求発行部１９は、クライアントに更新失敗通知を送信するよう更新失敗通知部１５から依頼された場合には、更新失敗通知を生成する。そして、要求発行部１９は、生成した更新失敗通知をクライアント位置判断部２３に出力するとともに、更新失敗通知部１５が識別したクライアントを通知する。
【００７５】
一方、要求発行部１９は、ノードに更新失敗通知を送信するよう更新失敗通知部１５から依頼された場合には、更新失敗通知を生成するとともに、更新失敗通知部１５から取得したルーティング情報を更新失敗通知に格納する。その後、要求発行部１９は、生成した更新失敗通知をトポロジー計算部２１に出力する。
【００７６】
なお、要求発行部１９は、更新完了通知部１６から更新失敗通知を送信するよう依頼された場合には、更新失敗通知部１５から更新失敗通知を送信するよう依頼された場合と同様の処理を実行する。すなわち、要求発行部１９は、更新失敗通知を生成し、生成した更新失敗通知をトポロジー計算部２１、もしくは、クライアント位置判断部２３に出力する。
【００７７】
また、要求発行部１９は、更新失敗通知部１５から更新失敗通知を取得するとともに、更新失敗通知部１５が識別したクライアントに更新失敗通知を転送するよう依頼された場合には、以下の処理を実行する。すなわち、要求発行部１９は、取得した更新失敗通知をクライアント位置判断部２３に出力するとともに、更新失敗通知部１５が識別したクライアントを通知する。
【００７８】
また、要求発行部１９は、更新失敗通知部１５から更新失敗通知を取得するとともに、更新失敗通知部１５が識別したノードに更新失敗通知を転送するよう依頼された場合には、以下の処理を実行する。すなわち、要求発行部１９は、取得した更新失敗通知をトポロジー計算部２１に出力する。
【００７９】
また、要求発行部１９は、クライアントに更新完了通知を送信するよう更新完了通知部１６から依頼された場合には、更新完了通知を生成する。そして、要求発行部１９は、生成した更新完了通知をクライアント位置判断部２３に出力するとともに、更新完了通知部１６が識別したクライアントを通知する。
【００８０】
また、要求発行部１９は、ノードに更新完了通知を送信するよう更新完了通知部１６から依頼された場合には、更新完了通知を生成するとともに、更新完了通知部１６から取得したルーティング情報を更新完了通知に格納する。その後、要求発行部１９は、生成した更新完了通知をトポロジー計算部２１に出力する。
【００８１】
また、要求発行部１９は、更新完了通知部１６から更新完了通知を取得するとともに、更新完了通知部１６が識別したクライアントに更新完了通知を転送するよう依頼された場合には、以下の処理を実行する。すなわち、要求発行部１９は、取得した更新完了通知をクライアント位置判断部２３に出力するとともに、更新完了通知部１６が識別したクライアントを通知する。
【００８２】
また、要求発行部１９は、更新完了通知部１６から更新完了通知を取得するとともに、更新完了通知部１６が識別したノードに更新完了通知を転送するよう依頼された場合には、以下の処理を実行する。すなわち、要求発行部１９は、取得した更新完了通知をトポロジー計算部２１に出力する。
【００８３】
クライアント位置記憶部２０は、ノード４に対してＰｕｔ要求を発行したクライアントのＩＰアドレスとＰｕｔ要求のトランザクションＩＤとを記憶する。具体的には、クライアント位置記憶部２０は、クライアント２がノード４にＰｕｔ要求を発行した場合には、クライアント２のＩＰアドレスを要求受信部１１から取得し、取得したＩＰアドレスを記憶する。
【００８４】
トポロジー計算部２１は、要求発行部１９からＰｕｔ要求を取得した場合には、取得したＰｕｔ要求に格納されたルーティング情報を用いて、ノード４がＰｕｔ要求を送信するノードを識別する。そして、トポロジー計算部２１は、取得したＰｕｔ要求をノード間要求並列送信部２２に出力するとともに、Ｐｕｔ要求を識別したノードに送信するよう依頼する。
【００８５】
また、トポロジー計算部２１は、要求発行部１９から更新失敗通知を取得した場合には、取得した更新失敗通知に格納されたルーティング情報を用いて、ノード４が更新失敗通知を送信するノードを識別する。具体的には、トポロジー計算部２１は、更新失敗通知に格納されたルーティング情報が示す経路を逆に辿り、ノード４に対してＰｕｒ要求を送信したノードを識別する。そして、トポロジー計算部２１は、取得した更新失敗通知をノード間要求並列送信部２２に出力するとともに、更新失敗通知を識別したノードに送信するよう依頼する。
【００８６】
また、トポロジー計算部２１は、要求発行部１９から更新完了通知を取得した場合には、更新失敗通知を取得した際と同様の処理を実行し、更新完了通知を送信するノードを識別する。そして、トポロジー計算部２１は、取得した更新完了通知をノード間要求並列送信部２２に出力するとともに、更新完了通知を識別したノードに送信するよう依頼する。
【００８７】
例えば、トポロジー計算部２１は、Ｐｕｔ要求に上述したルーティング情報Ｇ１が格納されている場合には、Ｐｕｔ要求を送信するノードとして、２ｎｄレプリカを記憶するノード５、および、３ｒｄレプリカを記憶するノード６を識別する。このような場合には、トポロジー計算部２１は、Ｐｕｔ要求をノード５およびノード６に送信するようノード間要求並列送信部２２に依頼する。
【００８８】
また、例えば、トポロジー計算部２１は、Ｐｕｔ要求に上述したルーティング情報Ｇ３が格納されている場合には、Ｐｕｔ要求を送信するノードとして、２ｎｄレプリカを記憶するノード５を識別する。このような場合には、トポロジー計算部２１は、Ｐｕｔ要求をノード５に送信するようノード間要求並列送信部２２に依頼する。
【００８９】
また、例えば、トポロジー計算部２１は、更新失敗通知に上述したルーティング情報Ｇ３が格納されている場合には、ルーティング情報Ｇ３の、Ｐｕｔ要求の転送元となるレプリカと転送先となるレプリカの組の集合を解析する。そして、トポロジー計算部２１は、３ｒｄレプリカを記憶するノード６が１ｓｔレプリカを記憶するノード４にＰｕｔ要求を送信すると判別する。このため、トポロジー計算部２１は、更新失敗通知の送信先がノード６であると判別し、更新失敗通知をノード６に送信するようノード間要求並列送信部２２に依頼する。
【００９０】
同様に、トポロジー計算部２１は、更新完了通知に上述したルーティング情報Ｇ３が格納されている場合には、更新完了通知の送信先として、３ｒｄレプリカを記憶するノード６を識別する。このような場合には、トポロジー計算部２１は、更新完了通知をノード６に送信するようノード間要求並列送信部２２に依頼する。
【００９１】
ノード間要求並列送信部２２は、トポロジー計算部２１から送信を依頼されたＰｕｔ要求、更新失敗通知、または、更新完了通知を、トポロジー計算部２１が識別したノードに対して送信する。例えば、ノード間要求並列送信部２２は、Ｐｕｔ要求をノード５に送信するよう依頼された場合には、Ｐｕｔ要求を格納したパケットにノード５のＩＰアドレスを宛先として格納し、ネットワークインターフェース１０に出力する。
【００９２】
クライアント位置判断部２３は、要求発行部１９から更新失敗通知を取得するとともに、クライアントの通知を取得した場合には、以下の処理を実行する。すなわち、クライアント位置判断部２３は、クライアント位置記憶部２０を参照し、通知されたクライアントのＩＰアドレスとＰｕｔ要求のトランザクションＩＤとを取得する。そして、クライアント位置判断部２３は、取得した更新失敗通知と取得したＩＰアドレスとトランザクションＩＤとをクライアント要求送信部２４に出力する。
【００９３】
同様に、クライアント位置判断部２３は、要求発行部１９から更新完了通知を取得するとともに、クライアントの通知を取得した場合には、通知されたクライアントのＩＰアドレスをクライアント位置記憶部２０から取得する。そして、クライアント位置判断部２３は、取得した更新完了通知と取得したＩＰアドレスとをクライアント要求送信部２４に出力する。
【００９４】
クライアント要求送信部２４は、クライアント位置判断部２３から取得したクライアントのＩＰアドレスを宛先として、更新失敗通知や更新完了通知をネットワークインターフェース１０を介して送信する。例えば、クライアント要求送信部２４は、更新失敗通知、または、更新完了通知を格納したパケットに通知されたＩＰアドレスを宛先として格納し、ネットワークインターフェース１０に出力する。
【００９５】
例えば、ネットワークインターフェース１０、要求処理部１２、Ｐｕｔ要求処理部１３、状態更新部１４、更新失敗通知部１５、更新完了通知部１６、データ更新部１７とは、電子回路である。また、要求発行部１９、トポロジー計算部２１、ノード間要求並列送信部２２、クライアント位置判断部２３、クライアント要求送信部２４とは、電子回路である。ここで、電子回路の例として、ＡＳＩＣ（Application  Specific  Integrated  Circuit）やＦＰＧＡ（Field  Programmable  Gate  Array）などの集積回路、またはＣＰＵ（Central  Processing  Unit）やＭＰＵ（Micro  Processing  Unit）などを適用する。
【００９６】
また、データ記憶部１８、クライアント位置記憶部２０とは、ＲＡＭ（Random  Access  Memory）、ＲＯＭ（Read  Only  Memory）、フラッシュメモリ（flash  memory）などの半導体メモリ素子、または、ハードディスク、光ディスクなどの記憶装置である。
【００９７】
上述したように、要求受信部１１は、クライアント２、３や、他ノード５〜７からマーク強度が格納されたＰｕｔ要求を受信する。また、要求処理部１２は、現在実行を準備中の更新処理と新たに受信したＰｕｔ要求による更新処理との優先度を比較し、新たに受信したＰｕｔ要求による更新処理の優先度が高いと判別した場合には、準備中の更新処理をキャンセルする。その後、要求処理部１２は、新たなＰｕｔ要求による更新処理の実行を準備するとともに、Ｐｕｔ要求に格納されたルーティング情報、または、ノード４が記憶するルーティング情報１８ｂに従って、Ｐｕｔ要求を他のノード５〜７に転送させる。
【００９８】
このため、ストレージシステム１は、任意のノードに発行されたＰｕｔ要求を適切に実行できる。例えば、ノード４は、自身に発行されたＰｕｔ要求を開始した後に、ノード５に発行されたＰｕｔ要求の転送を受付けた場合には、どちらのＰｕｔ要求が先に発行されたものであるかを判別し、より先に判別された方のＰｕｔ要求を実行する。この結果、ノード４は、任意のノードに発行されたＰｕｔ要求を適切に実行できる。
【００９９】
また、例えば、クライアント３とノード４が異なるデータセンターに設置されており、クライアント３とノード５が同じデータセンターに設置されている場合に、クライアント３は、１ｓｔレプリカを記憶するノード４にＰｕｔ要求を発行せずともよい。つまり、クライアント３は、異なるデータセンターに設置されたノード４ではなく、同じデータセンターに設置されたノード５にＰｕｔ要求を発行すればよい。このように、ストレージシステム１は、各クライアント２、３と各ノード４〜７との間のレイテンシを最小限に抑え、各クライアント２、３が発行したＰｕｔ要求が示す更新処理を、公平に実行することができる。
【０１００】
また、各クライアント２、３は、最も近いノードにＰｕｔ要求を発行することができる。この結果、ストレージシステム１は、各クライアント２、３が発行するＰｕｔ要求のラウンドトリップ時間を短縮することができる。例えば、クライアント２とノード４との通信に２ミリ秒のレイテンシが存在し、クライアント３とノード４との通信に２５ミリ秒のレイテンシが存在し、クライアント３とノード５との通信に２ミリ秒のレイテンシが存在するものとする。このような場合は、クライアント２がノード４にＰｕｔ要求を発行し、クライアント３がノード５にＰｕｔ要求を発行すれば、各クライアント２、３が発行するＰｕｔ要求のラウンドトリップ時間をそろえることができる。
【０１０１】
また、例えば、各クライアント２、３は、Ｇｅｔ要求を最寄のノードに発行するため、Ｐｕｔ要求の発行先ノードが指定されている場合には、Ｐｕｔ要求とＧｅｔ要求とで異なるノードに対し、セッションを設定することとなる。このため、従来のストレージシステムのように、Ｐｕｔ要求の発行先ノードが指定されている場合は、各クライアントとノードとの間に２つのセッションが設定されるので、セッション管理等に要する計算資源や通信資源が増大する。一方、ストレージシステム１においては、各クライアント２、３は、Ｇｅｔ要求と同様に、Ｐｕｔ要求を最寄のノードに発行することができる。このため、ストレージシステム１は、ッション管理等に要する計算資源や通信資源を削減することができる。
【０１０２】
次に、図４を用いて、ストレージシステム１が実行する処理の一例について説明する。図４は、実施例１に係るストレージシステムが実行する処理を説明するための図である。なお、図４に示す例では、クライアント２がクライアント３よりも先にＰｕｔ要求を発行したものとする。また、図４に示す例では、ネットワークの遅延により、クライアント３が後に発行したＰｕｔ要求をノード６が取得し、その後、クライアント２が発行したＰｕｔ要求をノード４が取得したものとする。
【０１０３】
また、図４に示す例では、クライアント２、３は、Ｐｕｔ要求を発行した時刻をマーク強度として格納するものとする。また、図４に示す例では、ノード４は、ルーティング情報Ｇ１を記憶し、ノード６がルーティング情報Ｇ３を記憶しているものとする。また、図４に示す例では、各ノード４〜７は、先に発行されたＰｕｔ要求による更新処理の優先度が高いと判別するものとする。
【０１０４】
例えば、図４中（Ｇ）に示すように、ノード６は、クライアント３からＰｕｔ要求を受信する。このような場合には、ノード６は、クライアント３のＰｕｔ要求による更新処理の実行を準備するとともに、図４中（Ｈ）に示すように、クライアント３のＰｕｔ要求をノード７に転送する。ここで、図４中（Ｉ）に示すように、ノード４は、クライアント２からＰｕｔ要求を受信する。
【０１０５】
次に、ノード７は、クライアント３のＰｕｔ要求による更新処理の実行を準備するとともに、図４中（Ｊ）に示すように、Ｐｕｔ要求をノード５に転送する。また、図４中（Ｋ）に示すように、ノード４は、クライアント２のＰｕｔ要求をノード５に転送し、図４中（Ｌ）に示すように、クライアント２のＰｕｔ要求をノード６に転送する。すると、ノード５およびノード６は、クライアント２のＰｕｔ要求による更新処理とクライアント３のＰｕｔ要求による更新処理との優先度を比較し、先に発行されたクライアント２のＰｕｔ要求による更新処理の方が優先度が高いと判別する。
【０１０６】
このため、ノード５は、クライアント２のＰｕｔ要求に対して、更新失敗通知をノード７に発行する。また、ノード７は、更新失敗通知をノード６に転送する。その後、ノード６は、Ｐｕｔ要求を転送したノード７から更新失敗通知を取得した後に、更新失敗通知をクライアント３に送信する。
【０１０７】
また、ノード５は、クライアント２のＰｕｔ要求による更新処理の実行を準備するとともに、図４中（Ｍ）に示すように、クライアント２のＰｕｔ要求をノード７に転送する。ノード７は、クライアント２のＰｕｔ要求による更新処理の実行を準備し、図４中（Ｎ）に示すように、クライアント２のＰｕｔ要求をノード６に転送する。
【０１０８】
その後ノード６は、Ｐｕｔ要求による更新処理を実行し、更新完了通知をノード４とノード７に送信する。このような場合には、ノード７は、準備していた更新処理を実行するとともに、ノード５に更新完了通知を転送する。また、ノード５は、更新完了通知を受信した場合には、準備していた更新処理を実行するとともに、ノード４に更新完了通知を転送する。
【０１０９】
その後、ノード４は、ノード６とノード５から更新完了通知を受信した場合には、準備していた更新処理を実行するとともに、クライアント２に対して更新完了通知を転送する。このように、ストレージシステム１は、それぞれ異なるノード４、６に対してＰｕｔ要求が発行された場合にも、先に発行されたＰｕｔ要求による更新処理のみを実行することができる。このため、ストレージシステム１は、Ｐｕｔ要求の発行先を任意化した場合にも、Ｓｔｒｏｎｇ  Ｃｏｎｓｉｓｔｅｎｃｙを保持したまま、Ｐｕｔ要求による更新処理を適切に実行することができる。
【０１１０】
なお、各ノード４〜７は、Ｐｕｔ要求にトランザクションＩＤを付与し、更新失敗通知、または、更新成功通知を送信する場合には、対応するＰｕｔ要求に付与されたトランザクションＩＤを付与することで、Ｐｕｔ要求と各通知との対応を識別してもよい。
【０１１１】
次に、図５、図６を用いて、Ｐｕｔ要求処理部１３がＰｕｔ要求を受信した際に実行する処理の流れについて説明する。図５は、実施例１に係るノードがＰｕｔ要求を受信した際に実行する処理の流れを説明するための第１の図である。また、図６は、実施例１に係るノードがＰｕｔ要求を受信した際に実行する処理の流れを説明するための第２の図である。
【０１１２】
例えば、Ｐｕｔ要求処理部１３は、Ｐｕｔ要求を受信した場合には、図５に示す各処理を実行する。すなわち、Ｐｕｔ要求処理部１３は、Ｐｕｔ要求による更新処理の対象となるレプリカをデータ記憶部１８から検索する（ステップＳ１０１）。次に、Ｐｕｔ要求処理部１３は、状態管理表１８ａの読出しを行い、更新ステータスを取得する（ステップＳ１０２）。そして、Ｐｕｔ要求処理部１３は、他のＰｕｔ要求による更新処理が実行中か否か、すなわち、更新ステータスに他のＰｕｔ要求による更新処理の情報が格納されているか否かを判別する（ステップＳ１０３）。
【０１１３】
また、Ｐｕｔ要求処理部１３は、他のＰｕｔ要求による更新処理が準備中ではないと判別した場合には（ステップＳ１０３否定）、Ｐｕｔ要求を転送するルーティング情報を取得する（ステップＳ１０４）。そして、Ｐｕｔ要求処理部１３は、取得したルーティング情報を用いて、自身が経路の終端であるか否かを判別する（ステップＳ１０５）。
【０１１４】
また、Ｐｕｔ要求処理部１３は、自身が経路の終端であると判別した場合には（ステップＳ１０５肯定）、更新完了通知部１６にＰｕｔ要求を出力し（ステップＳ１０６）、処理を終了する。また、Ｐｕｔ要求処理部１３は、自身が経路の終端ではないと判別した場合には（ステップＳ１０５否定）、状態更新部１４にＰｕｔ要求を出力し（ステップＳ１０７）、処理を終了する。
【０１１５】
また、Ｐｕｔ要求処理部１３は、他のＰｕｔ要求による更新処理が準備中であると判別した場合には（ステップＳ１０３肯定）、図６に示す処理を実行する。すなわち、Ｐｕｔ要求処理部１３は、Ｐｕｔ要求を転送するルーティング情報を取得する（ステップＳ１０８）。そして、Ｐｕｔ要求処理部１３は、取得したルーティング情報を用いて、ノード４が終端であるか否かを判別する（ステップＳ１０９）。
【０１１６】
また、Ｐｕｔ要求処理部１３は、ノード４が経路の終端ではないと判別した場合には（ステップＳ１０９否定）、更新ステータスから現在のマーク強度を取得するとともに、Ｐｕｔ要求からマーク強度を取得する（ステップＳ１１０）。そして、Ｐｕｔ要求処理部１３は、Ｐｕｔ要求のマーク強度が、現在のマーク強度よりも大きいか否かを判別する（ステップＳ１１１）。
【０１１７】
その後、Ｐｕｔ要求処理部１３は、Ｐｕｔ要求のマーク強度が、現在のマーク強度よりも大きいと判別した場合には（ステップＳ１１１肯定）、状態更新部１４にＰｕｔ要求を出力し（ステップＳ１１２）、処理を終了する。また、Ｐｕｔ要求処理部１３は、Ｐｕｔ要求のマーク強度が、現在のマーク強度以下であると判別した場合には（ステップＳ１１１否定）、更新失敗通知部１５にＰｕｔ要求を出力し（ステップＳ１１３）、処理を終了する。
【０１１８】
また、Ｐｕｔ要求処理部１３は、ノード４が経路の終端であると判別した場合には（ステップＳ１０９肯定）、更新ステータスから現在のマーク強度を取得するとともに、Ｐｕｔ要求からマーク強度を取得する（ステップＳ１１４）。そして、Ｐｕｔ要求処理部１３は、Ｐｕｔ要求のマーク強度が、現在のマーク強度よりも大きいか否かを判別する（ステップＳ１１５）。
【０１１９】
その後、Ｐｕｔ要求処理部１３は、Ｐｕｔ要求のマーク強度が、現在のマーク強度よりも大きいと判別した場合には（ステップＳ１１５肯定）、更新完了通知部１６にＰｕｔ要求を出力し（ステップＳ１１６）、処理を終了する。また、Ｐｕｔ要求処理部１３は、Ｐｕｔ要求のマーク強度が、現在のマーク強度以下であると判別した場合には（ステップＳ１１５否定）、更新失敗通知部１５にＰｕｔ要求を出力し（ステップＳ１１３）、処理を終了する。
【０１２０】
次に、図７を用いて、状態更新部１４がＰｕｔ要求を取得した際に実行する状態更新処理の流れについて説明する。図７は、実施例１に係る状態更新処理の流れについて説明するためのフローチャートである。例えば、図７に示す例では、状態更新部１４は、Ｐｕｔ要求を取得したことをトリガとして、状態更新処理を開始する。
【０１２１】
まず、状態更新部１４は、Ｐｕｔ要求からマーク強度とルーティング情報とを取得する（ステップＳ２０１）。次に、状態更新部１４は、状態管理表１８ａの更新ステータスを、取得したマーク強度とルーティング情報とに応じて更新する（ステップＳ２０２）。具体的には、状態更新部１４は、取得したルーティング情報から親レプリカと子レプリカ数とを識別し、マーク強度とともに、更新ステータスとして格納する。次に、状態更新部１４は、Ｐｕｔ要求を要求発行部１９に送信することで、Ｐｕｔ要求を子レプリカを記憶するノードに転送するよう依頼し（ステップＳ２０３）、処理を終了する。
【０１２２】
次に、図８を用いて、更新失敗通知部１５がＰｕｔ要求を取得した際に実行する更新失敗通知処理の流れについて説明する。図８は、実施例１に係る更新失敗通知処理の流れについて説明するためのフローチャートである。例えば、図８に示す例では、更新失敗通知部１５は、Ｐｕｔ要求を取得したことをトリガとして、更新失敗通知処理を開始する。
【０１２３】
まず、更新失敗通知部１５は、Ｐｕｔ要求に格納されたルーティング情報を用いて、親、すなわち、ノード４に対してＰｕｔ要求を送信したノード、または、クライアントを識別する（ステップＳ３０１）。そして、更新失敗通知部１５は、親がクライアントであるか否かを判別する（ステップＳ３０２）。
【０１２４】
また、更新失敗通知部１５は、親がクライアントである場合には（ステップＳ３０２肯定）、要求発行部１９にクライアントへ更新失敗通知を送信するよう依頼し（ステップＳ３０３）、処理を終了する。また、更新失敗通知部１５は、親がクライアントでない場合には（ステップＳ３０２否定）、親レプリカを記憶するノードを識別し（ステップＳ３０４）、識別したノードに更新失敗通知を送信するよう要求発行部１９に依頼する（ステップＳ３０５）。その後、更新失敗通知部１５は、処理を終了する。
【０１２５】
次に、図９を用いて、更新完了通知部１６がＰｕｔ要求を取得した際に実行する更新完了通知処理の流れについて説明する。図９は、実施例１に係る更新完了通知処理の流れについて説明するためのフローチャートである。例えば、図９に示す例では、更新完了通知部１６は、Ｐｕｔ要求を取得したことをトリガとして、更新失敗通知処理を開始する。
【０１２６】
まず、更新完了通知部１６は、取得したＰｕｔ要求に従って、データ記憶部１８に記憶されたレプリカを更新するようデータ更新部１７に依頼する（ステップＳ４０１）。そして、更新完了通知部１６は、ルーティング情報を用いて、親ノード、または、親レプリカを識別する（ステップＳ４０２）。また、更新完了通知部１６は、親がクライアントであるか否かを判別する（ステップＳ４０３）。
【０１２７】
そして、更新完了通知部１６は、親がクライアントであると判別した場合には（ステップＳ４０３肯定）、クライアントに更新完了通知の送信を要求発行部１９に依頼し（ステップＳ４０４）、処理を終了する。また、更新完了通知部１６は、親がノードであると判別した場合には（ステップＳ４０３否定）、親レプリカを記憶するノードを識別し（ステップＳ４０５）、識別したノードに更新完了通知を送信するよう要求発行部１９に依頼する（ステップＳ４０６）。その後、更新完了通知部１６は、処理を終了する。
【０１２８】
次に、図１０、図１１を用いて、更新失敗通知部１５が更新失敗通知を取得した際に実行する処理の流れについて説明する。図１０は、更新失敗通知を取得した際に実行する処理の流れを説明するための第１のフローチャートである。図１１は、更新失敗通知を取得した際に実行する処理の流れを説明するための第２のフローチャートである。なお、図１０に示す例では、更新失敗通知部１５は、更新失敗通知を取得したことをトリガとして処理を開始する。
【０１２９】
まず、更新失敗通知部１５は、状態管理表１８ａから更新ステータスを読み出す（ステップＳ５０１）。そして、更新失敗通知部１５は、更新ステータスのマーク強度と更新失敗通知のマーク強度が一致するか否かを判別する（ステップＳ５０２）。そして、更新失敗通知部１５は、更新ステータスのマーク強度と更新失敗通知のマーク強度とが一致する場合は（ステップＳ５０２肯定）、以下の処理を実行する。すなわち、更新失敗通知部１５は、状態管理表１８ａの更新失敗フラグを更新ステータスに設定するとともに、更新ステータスの子レプリカ数を１減らす（ステップＳ５０３）。
【０１３０】
次に、更新失敗通知部１５は、更新ステータスの子レプリカ数が０であるか否かを判別し（ステップＳ５０４）、更新ステータスの子レプリカ数が０であると判別した場合には（ステップＳ５０４肯定）、以下の処理を実行する。すなわち、更新失敗通知部１５は、更新が失敗した更新処理を要求したＰｕｔ要求の送信元である親が、クライアントであるか否かを判別する（ステップＳ５０５）。
【０１３１】
そして、更新失敗通知部１５は、親がクライアントである場合には（ステップＳ５０５肯定）、要求発行部１９にクライアントへ更新失敗通知を送信するよう依頼し（ステップＳ５０６）、処理を終了する。また、更新失敗通知部１５は、親がクライアントではない場合には（ステップＳ５０５否定）、親レプリカを記憶するノードを識別し（ステップＳ５０７）、識別したノードに更新失敗通知を送信するよう要求発行部１９に依頼する（ステップＳ５０８）。その後、更新失敗通知部１５は、処理を終了する。なお、更新失敗通知部１５は、更新ステータスの子レプリカ数が０ではないと判別した場合には（ステップＳ５０４否定）、処理を終了する。
【０１３２】
一方、更新失敗通知部１５は、更新ステータスのマーク強度と更新失敗通知のマーク強度とが一致しない場合は（ステップＳ５０２否定）、図１１に示す処理を開始する。すなわち、更新失敗通知部１５は、状態管理表１８ａのキャンセル表から、更新失敗通知のマーク強度と一致するマーク強度を有するエントリを取得する（ステップＳ５０９）。
【０１３３】
次に、更新失敗通知部１５は、取得したエントリの子レプリカ数を１減らし（ステップＳ５１０）、子レプリカ数が０になったか否かを判別する（ステップＳ５１１）。次に、更新失敗通知部１５は、子レプリカ数が０になったと判別した場合は（ステップＳ５１１肯定）、取得したエントリをキャンセル表から削除するとともに（ステップＳ５１２）、以下の処理を実行する。すなわち、更新失敗通知部１５は、更新が失敗した更新処理を要求したＰｕｔ要求の送信元である親が、クライアントであるか否かを判別する（ステップＳ５１３）。
【０１３４】
そして、更新失敗通知部１５は、親がクライアントである場合には（ステップＳ５１３肯定）、要求発行部１９にクライアントへ更新失敗通知を送信するよう依頼し（ステップＳ５１４）、処理を終了する。また、更新失敗通知部１５は、親がクライアントではない場合には（ステップＳ５１３否定）、親レプリカを記憶するノードを識別し（ステップＳ５１５）、識別したノードに更新失敗通知を送信するよう要求発行部１９に依頼する（ステップＳ５１６）。その後、更新失敗通知部１５は、処理を終了する。なお、更新失敗通知部１５は、更新ステータスの子レプリカ数が０ではないと判別した場合には（ステップＳ５１１否定）、処理を終了する。
【０１３５】
次に、図１２、図１３、図１４を用いて、更新完了通知部１６が更新完了通知を取得した際に実行する処理の流れについて説明する。図１２は、更新完了通知を取得した際に実行する処理の流れを説明するための第１のフローチャートである。図１３は、更新完了通知を取得した際に実行する処理の流れを説明するための第２のフローチャートである。図１４は、更新完了通知を取得した際に実行する処理の流れを説明するための第３のフローチャートである。
【０１３６】
まず、図１２に示す例では、更新完了通知部１６は、更新完了通知を取得したことをトリガとして、処理を開始する。まず、更新完了通知部１６は、更新ステータスを状態管理表１８ａから取得する（ステップＳ６０１）。次に、更新完了通知部１６は、更新ステータスのマーク強度と更新完了通知のマーク強度とが一致するか否かを判別する（ステップＳ６０２）。そして、更新完了通知部１６は、更新ステータスのマーク強度と更新完了通知のマーク強度とが一致しない場合には（ステップＳ６０２否定）、図１１に示した更新失敗通知部１５と同じ処理を実行する。
【０１３７】
一方、更新完了通知部１６は、更新ステータスのマーク強度と更新完了通知のマーク強度とが一致する場合には（ステップＳ６０２肯定）、更新失敗フラグが設定済みか否かを判別する（ステップＳ６０３）。
【０１３８】
ここで、更新完了通知部１６は、更新失敗フラグが設定済みではない場合には（ステップＳ６０３否定）、図１３に示す処理を実行する。すなわち、更新完了通知部１６は、状態管理表１８ａの更新ステータスの子レプリカ数を１減らし（ステップＳ６０４）、子レプリカ数が０になったか否かを判別する。そして、更新完了通知部１６は、子レプリカ数が０になったと判別した場合には（ステップＳ６０５肯定）、レプリカの更新をデータ更新部１７に依頼する（ステップＳ６０６）。
【０１３９】
次に、更新完了通知部１６は、状態管理表１８ａの更新ステータスをクリアし（ステップＳ６０７）、更新が完了した更新処理を要求したＰｕｔ要求の送信元である親がクライアントであるか否かを判別する（ステップＳ６０８）。そして、更新完了通知部１６は、親がクライアントである場合には（ステップＳ６０８肯定）、要求発行部１９にクライアントへ更新完了通知を送信するよう依頼し（ステップＳ６０９）、処理を終了する。
【０１４０】
また、更新完了通知部１６は、親がクライアントではない場合には（ステップＳ６０８否定）、親レプリカを記憶するノードを識別し（ステップＳ６１０）、識別したノードに更新完了通知を送信するよう要求発行部１９に依頼する（ステップＳ６１１）。その後、更新完了通知部１６は、処理を終了する。なお、更新完了通知部１６は、子レプリカ数が０ではない場合には（ステップＳ６０５否定）、処理を終了する。
【０１４１】
一方、図１２に戻って、更新完了通知部１６は、更新失敗フラグが設定済みであると判別した場合には（ステップＳ６０３肯定）、状態管理表１８ａの更新ステータスの子レプリカ数を１減らし（ステップＳ６１２）、子レプリカ数が０になったか否かを判別する（ステップＳ６１３）。次に、更新完了通知部１６は、子レプリカ数が０になったと判別した場合は（ステップＳ６１３肯定）、更新が失敗した更新処理を要求したＰｕｔ要求の送信元である親が、クライアントであるか否かを判別する（ステップＳ６１４）。
【０１４２】
そして、更新完了通知部１６は、親がクライアントである場合には（ステップＳ６１４肯定）、要求発行部１９にクライアントへ更新失敗通知を送信するよう依頼し（ステップＳ６１５）、処理を終了する。また、更新完了通知部１６は、親がクライアントではない場合には（ステップＳ６１４否定）、親レプリカを記憶するノードを識別し（ステップＳ６１６）、識別したノードに更新失敗通知を送信するよう要求発行部１９に依頼する（ステップＳ６１７）。その後、更新完了通知部１６は、処理を終了する。なお、更新完了通知部１６は、子レプリカ数が０ではない場合には（ステップＳ６１３否定）、処理を終了する。
【０１４３】
[ノードの効果]
上述したように、ノード４は、更新処理の優先度であるマーク強度が格納されたＰｕｔ要求を受信する。そして、ノード４は、Ｐｕｔ要求を受信した際に、他の更新処理を実行している場合には、新たに受信したＰｕｔ要求が要求する更新処理の優先度が、準備中の更新処理の優先度よりも高いか否かを判別する。例えば、ノード４は、新たに受信したＰｕｔ要求が発行された時刻が、準備中の更新処理を要求したＰｕｔ要求が発行された時刻よりも先であるか否かを判別する。
【０１４４】
そして、ノード４は、新たに受信したＰｕｔ要求が要求する更新処理の優先度が、準備中の更新処理の優先度よりも高いと判別した場合には、準備中の更新処理をキャンセルするとともに、新たに受信したＰｕｔ要求を、他のノード５〜７へ転送する。このため、ノード４〜７を有するストレージシステム１は、どのノード４〜７に発行されたＰｕｔ要求も適切に実行することができる。
【０１４５】
また、ノード４は、新たに受信したＰｕｔ要求が要求する更新処理の優先度が、準備中の更新処理の優先度よりも低いと判別した場合には、Ｐｕｔ要求の送信元に対して、更新失敗通知を送信する。このため、ノード４〜７を有するストレージシステム１は、優先度の高い更新処理を優先して実行するとともに、優先度の低い更新処理を要求するＰｕｔ要求の送信元へ、Ｐｕｔ要求が失敗した旨を通知することができる。
【０１４６】
また、ノード４は、Ｐｕｔ要求を転送したノードから更新失敗通知を受信した場合には、転送したＰｕｔ要求が要求する更新処理の実行をキャンセルするとともに、更新失敗通知を、ノード４にＰｕｔ要求を送信したノードやクライアントへ転送する。このため、ノード４〜７を有するストレージシステム１は、Ｐｕｔ要求の送信先で失敗した更新処理を実行することなく、処理を進めることができる。
【０１４７】
また、ノード４は、クライアントから受信したＰｕｔ要求には、自身が記憶するルーティング情報１８ｂを格納するとともに、ルーティング情報１８ｂが示す経路に従って、Ｐｕｔ要求を他のノード５〜７に転送する。また、ノード４は、他のノード５〜７から受信したＰｕｔ要求を転送する場合には、Ｐｕｔ要求に格納されたルーティング情報、すなわち、他のノード５〜７が記憶するルーティング情報に従って、Ｐｕｔ要求を転送する。このため、ノード４〜７を有するストレージシステム１は、Ｐｕｔ要求を受付けた各ノード４〜７ごとに、効率良くＰｕｔ要求を転送する経路を定めることができる。
【０１４８】
また、ノード４は、自身がＰｕｔ要求を転送した全てのノードから更新完了通知を受信した場合には、Ｐｕｔ要求の送信元であるクライアント、または、他のノードへ更新完了通知を送信する。このため、ノード４〜７を有するストレージシステム１は、Ｐｕｔ要求を転送する経路が複数存在する場合、つまり、Ｐｕｔ要求を送信する経路がマルチパスである場合にも、Ｓｔｒｏｎｇ  Ｃｏｎｓｉｓｔｅｎｃｙを保持したまま、更新処理を実行することができる。
【０１４９】
また、ノード４は、実行をキャンセルした更新処理についての更新完了通知を他のノードから受信した場合には、実行をキャンセルした更新処理を要求するＰｕｔ要求の送信元へ、更新失敗通知を送信する。このため、ノード４は、キャンセルされる更新処理についての更新完了通知を転送することなく、各ノード４〜７が実行する更新処理をそろえることができる。
【０１５０】
また、ノード４は、更新処理の準備中にＰｕｔ要求を受信した場合は、準備中の更新処理を要求したＰｕｔ要求が発行された時刻と、新たに受信したＰｕｔ要求が発行された時刻とを比較し、より早く発行されたＰｕｔ要求が要求する更新処理を実行する。このため、ノード４は、各ノード４〜７の設置位置が分散されている場合にも、各クライアント２、３が発行するＰｕｔ要求が要求する更新処理を公平に実行することができる。
【実施例２】
【０１５１】
以下の実施例２では実施例１の状態管理表１８ａとは異なる状態管理表１８ｄを有するノード４ａについて説明する。まず、図１５を用いて、ノード４ａについて説明する。図１５は、実施例２に係るノードの機能構成を説明するための図である。なお、図１５に示す例では、図２に示した各部１０〜２４と同様の処理を実行するものについては、同じ符号を付し、以下の説明を省略する。
【０１５２】
図１５に示す例では、ノード４ａは、要求処理部１２ａ、要求発行部１９ａを有する。要求処理部１２ａは、Ｐｕｔ要求処理部１３ａ、状態更新部１４ａ、更新失敗通知部１５ａ、更新完了通知部１６ａを有する。また、ノード４ａは、データ記憶部１８に、状態管理表１８ｄを記憶させる。
【０１５３】
図１６は、実施例２に係る状態管理表を説明するための図である。図１６に示す例では、状態管理表１８ｄには、更新ステータスとして、マーク強度、親レプリカ、親のエージ、子レプリカ数が格納され、ノード４ａのエージが更新ステータスとは別に格納される。なお、更新処理を要求するＰｕｔ要求の送信元がクライアントである場合には、親レプリカの代わりにクライアントを示す情報が格納される。
【０１５４】
また、エージとは、ノード４ａが更新失敗通知および更新完了通知を他のノードから受信した際に、他のノードにおいて失敗、または完了した更新処理が、他の更新処理と衝突したか否かを判別するための情報である。また、図１６に示す例では、転送されるＰｕｔ要求、更新失敗通知、更新完了通知には、マーク強度とルーティング情報とに加えて、エージ情報が格納される。
【０１５５】
Ｐｕｔ要求処理部１３ａは、Ｐｕｔ要求処理部１３が実行する処理と同様の処理を実行する。ただし、Ｐｕｔ要求処理部１３ａは、新たに受信したＰｕｔ要求のマーク強度が更新ステータスのマーク強度よりも低い場合には、更新ステータスの情報を更新失敗通知部１５ａに出力する。つまり、Ｐｕｔ要求処理部１３ａは、キャンセルされる更新要求の情報を更新失敗通知部１５ａに出力する。その後、Ｐｕｔ要求処理部１３ａは、新たに受信したＰｕｔ要求を状態更新部１４ａに出力する。
【０１５６】
状態更新部１４ａは、状態更新部１４が実行する処理と同様の処理を実行する。また、状態更新部１４ａは、クライアントがノード４ａに発行したＰｕｔ要求を取得した場合には、更新ステータスに、クライアントのエージ「⊥」を併せて格納する。ここで、「⊥」とは、エージの最小値を示す記号であるが、他の記号を採用することとしてもよい。
【０１５７】
更新失敗通知部１５ａは、更新失敗通知部１５と同様の処理を実行する。ただし、更新失敗通知部１５ａは、更新ステータスの情報、つまり、キャンセルされる更新処理に係るマーク強度、親レプリカ、親のエージ、子レプリカ数を通知された場合は、以下の処理を実行する。
【０１５８】
すなわち、更新失敗通知部１５ａは、取得した更新ステータスに含まれる親レプリカを記憶するノード、または、クライアントに対して更新失敗通知を送信するよう要求発行部１９ａに依頼する。また、更新失敗通知部１５ａは、ノード４ａのエージを１インクリメントする。また、更新失敗通知部１５ａは、更新失敗通知を取得した場合には、更新ステータスを状態管理表１８ｄから取得し、更新失敗通知に格納されたマーク強度と更新ステータスのマーク強度が一致するか否かを判別する。また、更新失敗通知部１５ａは、更新失敗通知に格納されたエージと、状態管理表１８ｄの現在のエージとが一致するか否かを判別する。
【０１５９】
そして、更新失敗通知部１５ａは、更新失敗通知のマーク強度が更新ステータスのマーク強度と一致し、かつ、更新失敗通知のエージと、現在のエージが一致しない場合には、準備中の更新処理をキャンセルするため、更新ステータスをクリアする。つまり、更新失敗通知部１５ａは、ノード４ａから転送したＰｕｔ要求が他のノードで他のＰｕｔ要求と衝突し、優先度負けして実行されなかったと判別した場合には、準備中の更新処理をキャンセルするため、更新ステータスをクリアする。
【０１６０】
そして、更新失敗通知部１５ａは、キャンセルした更新処理を要求したＰｕｔ要求の送信元であるクライアント、または、ノードを識別し、識別したクライアント、または、ノードに更新失敗通知を送信するよう要求発行部１９ａに依頼する。なお、更新失敗通知部１５ａは、更新失敗通知を送信するよう要求発行部１９ａに依頼する場合には、Ｐｕｔ要求に格納されていたエージ、すなわち、Ｐｕｔ要求の送信元である親のエージを出力する。また、更新失敗通知部１５ａは、更新失敗通知を転送するよう要求発行部１９ａに依頼する場合には、クリアする更新ステータスに含まれる親のエージを出力する。
【０１６１】
更新完了通知部１６ａは、更新完了通知を取得した場合には、更新ステータスを状態管理表１８ｄから取得し、更新完了通知のマーク強度が更新ステータスのマーク強度と一致し、かつ、更新完了通知のエージと、現在のエージが一致するか判別する。そして、更新完了通知部１６ａは、更新ステータスを状態管理表１８ｄから取得し、更新完了通知のマーク強度が更新ステータスのマーク強度と一致し、かつ、更新完了通知のエージと、現在のエージが一致する場合には、以下の処理を実行する。
【０１６２】
まず、更新完了通知部１６ａは、更新ステータスの子レプリカ数を１デクリメントする。次に、更新完了通知部１６ａは、更新ステータスの子レプリカ数が０となったか否かを判別する。つまり、更新完了通知部１６ａは、Ｐｕｔ要求を転送した全てのノードから、マーク強度とエージとが一致する更新完了通知を取得したか否かを判別する。そして、更新完了通知部１６ａは、更新ステータスの子レプリカ数が０となった場合には、レプリカを更新するとともに、更新ステータスをクリアする。
【０１６３】
そして、更新完了通知部１６ａは、実行した更新処理を要求するＰｕｔ要求の送信元であるクライアント、またはノードを識別し、識別したクライアント又はノードに更新完了通知を送信するよう要求発行部１９ａに依頼する。なお、更新完了通知部１６ａは、更新完了通知を送信するよう要求発行部１９ａに依頼する場合には、Ｐｕｔ要求に格納されていたエージ、すなわち、Ｐｕｔ要求の送信元である親のエージを出力する。また、更新完了通知部１６ａは、更新失敗通知や更新完了通知を転送するよう要求発行部１９ａに依頼する場合には、クリアする更新ステータスに含まれる親のエージを出力する。
【０１６４】
要求発行部１９ａは、要求発行部１９と同様の処理を実行する。また、要求発行部１９ａは、更新失敗通知部１５ａ、または、更新完了通知部１６ａから更新失敗通知を送信するよう依頼された場合には、以下の処理を実行する。すなわち、要求発行部１９ａは、更新失敗通知を送信する依頼とともに、クリアする更新ステータスに含まれる親のエージを取得し、取得した親のエージを更新失敗通知に格納する。
【０１６５】
また、要求発行部１９ａは、Ｐｕｔ要求を送信する場合には、状態管理表１８ｄを参照し、更新ステータスを取得する。そして、要求発行部１９ａは、取得した状態管理表１８ｄの現在のエージをＰｕｔ要求に格納し、エージを格納したＰｕｔ要求を送信する。
【０１６６】
また、要求発行部１９ａは、更新完了通知や更新失敗通知を生成した場合には、更新処理を要求したＰｕｔ要求に格納されているエージ、つまり、親ノードのエージを格納する。また、要求発行部１９ａは、更新完了通知や更新失敗通知を転送する場合には、更新失敗通知部１５ａや更新完了通知部１６ａから通知されたエージを格納する。
【０１６７】
このようなノード４ａは、クライアント２から受信したＰｕｔ要求を転送する場合には、現在のエージをＰｕｔ要求に格納して転送する。また、ノード４ａは、終端ではなく、かつ、他のノードから受信したＰｕｔ要求が優先度負けしない場合には、取得したＰｕｔ要求に格納されたエージを現在のエージ、つまり、ノード４ａ自身のエージとする。
【０１６８】
また、ノード４ａは、優先度負けした更新処理をキャンセルした場合には、キャンセルした更新処理を要求したＰｕｔ要求に格納されていたエージ、つまり親ノードのエージを更新失敗通知に格納し、その後、更新失敗通知を親ノードに送信する。また、ノード４ａは、更新失敗通知を送信する場合には、現在のエージを１加算する。その後、ノード４ａは、優先度勝ちした更新処理を要求したＰｕｔ要求に、現在のエージを格納し、子レプリカを記憶するノードに転送する。
【０１６９】
また、ノード４ａは、自身が終端であり、かつ、受信したＰｕｔ要求が示す更新処理が優先度負けしなかった場合には、レプリカのデータを更新するとともに、親ノードのエージが格納された更新完了通知を親ノードに送信する。また、ノード４ａは、レプリカのデータを更新した場合には、親ノードのエージを更新完了通知に格納し、その後、更新完了通知を親ノードに送信する。
【０１７０】
このため、ノード４ａは、送信したＰｕｔ要求が示す更新処理が、全ての子ノードにおいて実行され、かつ、ノード４ａにて準備中の更新処理が優先負けしなかった場合にのみ、現在のエージと同一のエージが格納された更新完了通知を受信する。一方、ノード４ａは、Ｐｕｔ要求を送信してから更新完了通知を受信するまでの間に、更新処理が優先度負けした場合には、現在のエージとは異なるエージが格納された更新完了通知を受信するので、レプリカの更新処理を実行しない。この結果、ノード４ａは、任意のノードに発行されたＰｕｔ要求を適切に実行することができる。
【０１７１】
次に、図１７を用いて、実施例２に係る更新失敗通知部１５ａが更新失敗通知を取得した際に実行する処理の流れについて説明する。図１７は、実施例２に係る更新失敗通知部が更新失敗通知を取得した際に実行する処理の流れを説明するためのフローチャートである。なお、図１７に示す例では、更新失敗通知部１５ａは、更新失敗通知を取得したことをトリガとして、処理を実行する。
【０１７２】
まず、更新失敗通知部１５ａは、状態管理表１８ｄから更新ステータスを取得する（ステップＳ７０１）。次に、更新失敗通知部１５ａは、更新ステータスと更新失敗通知とのマーク強度が一致し、かつ、更新ステータスのエージと現在のエージとが一致するか否かを判別する（ステップＳ７０２）。
【０１７３】
そして、更新失敗通知部１５ａは、各マーク強度、および、各エージが一致しない場合には（ステップＳ７０２否定）、処理を終了する。一方、更新失敗通知部１５ａは、各マーク強度、および、各エージが一致すると判別した場合には（ステップＳ７０２肯定）、状態管理表１８ｄの更新ステータスをクリアする（ステップＳ７０３）。
【０１７４】
また、更新失敗通知部１５ａは、クリアした更新ステータスが示す更新処理において、親がクライアントであるか否かを判別する（ステップＳ７０４）。そして、更新失敗通知部１５ａは、親がクライアントであると判別した場合には（ステップＳ７０４肯定）、要求発行部１９ａにクライアントへ更新失敗通知の送信を依頼し（ステップＳ７０５）、処理を終了する。
【０１７５】
一方、更新失敗通知部１５ａは、親がクライアントではないと判別した場合には（ステップＳ７０４否定）、親レプリカを記憶するノードを識別する（ステップＳ７０６）。その後、更新失敗通知部１５ａは、要求発行部１９ａに識別したノードへ更新失敗通知を送信するように依頼し（ステップＳ７０７）、処理を終了する。
【０１７６】
次に、図１８、図１９を用いて、更新完了通知部１６ａが、更新完了通知を取得した際に実行する処理の流れを説明する。なお、図１８は、実施例２に係る更新完了通知部が更新完了通知を取得した際に実行する処理の流れを説明するための第１のフローチャートである。また、図１９は、実施例２に係る更新完了通知部が更新完了通知を取得した際に実行する処理の流れを説明するための第２のフローチャートである。
【０１７７】
なお、図１８に示す例では、更新完了通知部１６ａは、更新完了通知を取得したことをトリガとして、処理を実行する。まず、更新完了通知部１６ａは、状態管理表１８ｄから更新ステータスを取得する（ステップＳ８０１）。次に、更新完了通知部１６ａは、更新ステータスと更新完了通知とのマーク強度が一致し、かつ、更新ステータスのエージと現在のエージとが一致するか否かを判別する（ステップＳ８０２）。そして、更新完了通知部１６ａは、更新ステータスと更新完了通知とのマーク強度が一致し、かつ、更新ステータスのエージと現在のエージとが一致しない場合は（ステップＳ８０２否定）、処理を終了する。
【０１７８】
そして、更新完了通知部１６ａは、各マーク強度、および、各エージが一致すると判別した場合には（ステップＳ８０２肯定）、状態管理表１８ｄの更新ステータスの子レプリカ数を１減らす（ステップＳ８０３）。次に、更新完了通知部１６ａは、子レプリカの数が０であるか否かを判別し（ステップＳ８０４）、子レプリカの数が０ではない場合には（ステップＳ８０４否定）、処理を終了する。一方、更新完了通知部１６ａは、子レプリカの数が０である場合には（ステップＳ８０４肯定）、図１９に示す処理を実行する。
【０１７９】
まず、更新完了通知部１６ａは、レプリカの更新をデータ更新部１７に依頼する（ステップＳ８０５）。次に、更新完了通知部１６ａは、状態管理表１８ｄの更新ステータスをクリアする（ステップＳ８０６）。そして、更新完了通知部１６ａは、クリアした更新ステータスが示す更新処理において、親がクライアントであるか否かを判別する（ステップＳ８０７）。
【０１８０】
そして、更新完了通知部１６ａは、親がクライアントであると判別した場合には（ステップＳ８０７肯定）、要求発行部１９ａにクライアントへ更新完了通知の送信を依頼し（ステップＳ８０８）、処理を終了する。一方、更新完了通知部１６ａは、親がクライアントではないと判別した場合には（ステップＳ８０７否定）、親レプリカを記憶するノードを識別する（ステップＳ８０９）。その後、更新完了通知部１６ａは、要求発行部１９ａに識別したノードへ更新完了通知を送信するように依頼し（ステップＳ８１０）、処理を終了する。
【０１８１】
[ノード４ａの効果]
上述したように、ノード４ａは、状態管理表１８ｄにキャンセル表を備えずとも、更新完了通知や更新失敗通知のエージと現在のエージとが一致するか否かを判別することにより、子レプリカを記憶するノードにおいて優先負けしたか否かを判別する。このため、ノード４ａは、キャンセル表を備えずとも、任意のノードに対して発行された複数のＰｕｔ処理が示す更新処理を、適切に実行することができる。
【０１８２】
また、ノード４ａは、状態管理表１８ｄにキャンセル表を有さないので、状態管理表１８ｄの容量を削減することができる。また、ノード４ａは、キャンセル表の各エントリについての操作を不要とするので、処理コストを削減することができる。
【０１８３】
また、ノード４ａは、現在のエージと更新完了通知のエージとが異なる場合には、すぐに更新失敗通知を親レプリカを記憶するノードやクライアントに送信する。このため、ノード４ａは、Ｐｕｔ要求の結果を迅速にクライアント２、３に送信することができる。
【実施例３】
【０１８４】
これまで本発明の実施例について説明したが実施例は、上述した実施例以外にも様々な異なる形態にて実施されてよいものである。そこで、以下では実施例３として本発明に含まれる他の実施例を説明する。
【０１８５】
（１）優先度について
上述したノード４、ノード４ａは、Ｐｕｔ要求が発行された時刻をマーク強度とし、先に発行されたＰｕｔ要求が要求する更新処理を実行した。しかし、実施例はこれに限定されるものではない。
【０１８６】
例えば、ノード４、４ａは、後に発行されたＰｕｔ要求が要求する更新処理を実行することとしてもよい。すなわち、ノード４、４ａは、準備中の更新要求に係るマーク強度と、新たに受信したＰｕｔ要求のマーク強度とを比較し、後の時刻を示すマーク強度が格納されたＰｕｔ要求が要求する更新要求を実行することとしてもよい。
【０１８７】
このような処理を実行した場合には、例えば、ノード４、４ａは、レプリカのデータが最後の更新のみが適用されるようなデータである場合には、更新処理をｌａｚｙに実行する結果、更新回数を削減することができる。
【０１８８】
また、ノード４、４ａは、複数のマーク強度を用いることとしてもよい。例えば、ノード４、４ａは、Ｐｕｔ要求が発行された時刻に加えて、Ｐｕｔ要求をクライアント２、３から受信したノードに一意の数値を格納する。そして、ノード４、４ａは、準備中の更新要求に係るＰｕｔ要求のマーク強度と、新たに受信したＰｕｔ要求のマーク強度を比較し、時刻が同一である場合には、Ｐｕｔ要求を受信したノードに応じて、実行する更新要求を決定しても良い。このような処理を実行した場合には、ノード４、４ａは、クライアント側が計測する時刻の制度が十分ではない場合にも、本発明を適用することができる。
【０１８９】
また、ノード４、４ａは、マーク強度として、Ｐｕｔ要求をノードが受信した際の時刻を用いることとしてもよい。一般に、ストレージシステムに含まれる各ノードの時刻は、高精度で一致しており、より信頼性の高い処理を実行することができる。
【０１９０】
また、ノード４、４ａは、Ｐｕｔ要求を発行させたユーザに応じて、実行する更新処理を決定しても良い。また、ノード４、４ａは、更新処理の対象となるデータのサイズに応じて、実行する更新処理を決定しても良い。例えば、ノード４、４ａは、小さいサイズのデータほど、優先的に更新処理が実行されることとしてもよい。すなわち、小さいサイズのデータほど、記憶領域を確保し易いという経験則より、ストレージシステム１全体のレイテンシを小さくすることができる。
【０１９１】
（２）ノードの数およびルーティング情報について
上述したストレージシステム１は、ノード４〜７を有していたが、実施例はこれに限定されるものではなく、任意の数のノードを有することができる。また、各ノード４〜７は、同じデータのレプリカを記憶していたが、実施例はこれに限定されるものではない。例えば、ノード４〜６がデータＡのレプリカを記憶し、ノード３〜７がデータＢのレプリカを記憶しているものとする。このような場合にも、各ノード４〜７は、レプリカごとにルーティング情報を有し、Ｐｕｔ要求の対象となるデータに応じたルーティング情報を格納した場合には、任意のノードに発行されたＰｕｔ要求を適切に実行することができる。
【０１９２】
また、上述したルーティング情報は、あくまで一例であり、Ｐｕｔ要求を転送する経路を特定することができるのであれば、任意の形式のルーティング情報を採用してよい。例えば、各ノードが記憶するレプリカのデータが移動せずに固定である場合には、Ｐｕｔ要求の転送先となるレプリカではなく、ノードを示す情報が格納されたルーティング情報であってもよい。
【０１９３】
（３）各情報について
上述したノード４、ノード４ａは、ルーティング情報、エージ、マーク強度をＰｕｔ要求、更新失敗通知、更新完了通知に格納して送信した。しかし、実施例はこれに限定されるものではなく、例えば、ノード４、ノード４ａは、ルーティング情報、エージ、マーク強度等を、Ｐｕｔ要求とともに送信してもよい。
【０１９４】
（４）プログラム
ところで、実施例１、２に係るノード４、４ａは、ハードウェアを利用して各種の処理を実現する場合を説明した。しかし、実施例はこれに限定されるものではなく、あらかじめ用意されたプログラムをストレージ装置として動作するコンピュータで実行することによって実現するようにしてもよい。そこで、以下では、図２０を用いて、実施例１に示したノード４と同様の機能を有するプログラムを実行するコンピュータの一例を説明する。図２０は、ストレージ制御プログラムを実行するコンピュータの一例を説明するための図である。
【０１９５】
図２０に例示されたコンピュータ１００は、ＲＯＭ（Read  Only  Memory）１１０、ＨＤＤ（Hard  Disk  Drive）１２０、ＲＡＭ（Random  Access  Memory）１３０、ＣＰＵ（Central  Processing  Unit）１４０がバス１６０で接続される。また、コンピュータ１００は、他のコンピュータと通信を行うためのＩ／Ｏ（Input  Output）１５０がバス１６０で接続される。
【０１９６】
なお、ＨＤＤ１２０は、通常のレプリカや、状態管理表１８ａ、ルーティング情報１８ｂ、ノード情報１８ｃが記憶されることとなる。ＲＡＭ１３０には、ストレージ制御プログラム１３１が記憶されており、ＣＰＵ１４０が読み出して実行することによって、図２０に示す例では、ストレージ制御プロセス１４１として機能するようになる。なお、ストレージ制御プロセス１４１は、図２に示すノード４と同様の機能を発揮するが、図１５に示すノード４ａと同様の機能を発揮させることも可能である。
【０１９７】
なお、本実施例で説明したシステム制御プログラムは、あらかじめ用意されたプログラムをパーソナルコンピュータやワークステーションなどのコンピュータで実行することによって実現することができる。このプログラムは、インターネットなどのネットワークを介して配布することができる。また、このプログラムは、ハードディスク、フレキシブルディスク（ＦＤ）、ＣＤ−ＲＯＭ（Compact  Disc  Read  Only  Memory）、ＭＯ（Magneto  Optical  Disc）、ＤＶＤ（Digital  Versatile  Disc）などのコンピュータで読取可能な記録媒体に記録される。また、このプログラムは、コンピュータによって記録媒体から読み出されることによって実行することもできる。
【符号の説明】
【０１９８】
１  ストレージシステム
２、３  クライアント
４〜７、４ａ  ノード
１０  ネットワークインターフェース
１１  要求受信部
１２、１２ａ  要求処理部
１３、１３ａ  Ｐｕｔ要求処理部
１４、１４ａ  状態更新部
１５、１５ａ  更新失敗通知部
１６、１６ａ  更新完了通知部
１７  データ更新部
１８  データ記憶部
１８ａ、１８ｄ  状態管理表
１９、１９ａ  要求発行部
２０  クライアント位置記憶部
２１  トポロジー計算部
２２  ノード間要求並列送信部
２３  クライアント位置判断部
２４  クライアント要求送信部
【図１】
0005879982.tif 000002
【図２】
0005879982.tif 000003
【図３】
0005879982.tif 000004
【図４】
0005879982.tif 000005
【図５】
0005879982.tif 000006
【図６】
0005879982.tif 000007
【図７】
0005879982.tif 000008
【図８】
0005879982.tif 000009
【図９】
0005879982.tif 000010
【図１０】
0005879982.tif 000011
【図１１】
0005879982.tif 000012
【図１２】
0005879982.tif 000013
【図１３】
0005879982.tif 000014
【図１４】
0005879982.tif 000015
【図１５】
0005879982.tif 000016
【図１６】
0005879982.tif 000017
【図１７】
0005879982.tif 000018
【図１８】
0005879982.tif 000019
【図１９】
0005879982.tif 000020
【図２０】
0005879982.tif 000021
【図２１】
0005879982.tif 000022
【図２２】
0005879982.tif 000023