(57)【特許請求の範囲】
【請求項１】
少なくとも１つの処理ノードを含むコンピューティングシステムにおいて耐障害及びリカバリを促進するための方法であって、第１のノードの可用性及びリカバリを促進するステップを含み、前記可用性及びリカバリを促進するステップが、前記第１のノードにおいて、
前記第１のノードにおいてスポーナを実行することであって、前記スポーナが、実行中に、第１のスポーンを生じさせ、
前記スポーナを実行することが、前記スポーナに第１の世代インジケータを割り当てることを含み、
前記第１のスポーンが、前記第１の世代インジケータを継承する、実行することと、
チェックポイント間隔を開始することであって、前記チェックポイント間隔の終わりに、前記第１のノードのリカバリのために使用可能であるノードのリカバリ情報が永続的ストレージにコミットされ、前記チェックポイント間隔を開始することが、
前記スポーナがスポーンを生じさせることを中断させること、
前記第１の世代インジケータとは異なる第２の世代インジケータを前記スポーナに割り当てること、
前記スポーナを再開し、それによって、前記スポーナが第２のスポーンを生じさせることを可能にすることであって、前記第２のスポーンが前記第２の世代インジケータを継承する、可能にすること、及び
前記第２のスポーンがメモリに書き込む範囲を制御することを含む、開始することと、
前記ノードのリカバリ情報をコミットした後、前記第２のスポーンがメモリに書き込むことができる前記範囲の制御を解放することとを含む、前記方法。
【請求項２】
第２のスポーンがメモリに書き込む範囲を制御することが、前記第２のスポーンが前記メモリへの書き込みを完了することを防止することを含む、請求項１に記載の方法。
【請求項３】
リカバリ情報がコミットされた後にメモリへの書き込みを最終的に完了するために第２のスポーンがメモリへの前記書き込みをキューに入れることを許すステップをさらに含む、請求項２に記載の方法。
【請求項４】
第２のスポーンがメモリに書き込む範囲を制御することが、書き込み動作が交換可能な動作であると決定することと、前記交換可能な動作の完了を可能にすることとを含む、請求項１に記載の方法。
【請求項５】
書き込み動作が交換可能な動作であると決定することが、前記書き込み動作が変数をインクリメントすることを含むと決定することを含む、請求項４に記載の方法。
【請求項６】
書き込み動作が交換可能な動作であると決定することが、前記書き込み動作が指定された位置にレコードを挿入することを含むと決定することを含む、請求項４に記載の方法。
【請求項７】
スポーナを中断させた後、期限を設定し、それによって、第１の世代インジケータを有するすべてのスポーンが完了するまで実行されるための時間を提供し、前記第１の世代インジケータを有する前記スポーンの状態を保存しなくてはならないことに関連するオーバーヘッドを避けるステップをさらに含む、請求項１に記載の方法。
【請求項８】
第１のスポーンが期限の時点でまだ実行されている場合に前記第１のスポーンを中断するステップをさらに含む、請求項７に記載の方法。
【請求項９】
第１のスポーンが期限までに実行を完了することができなかった結果としての中断を避けることを可能にするステップをさらに含む、請求項７に記載の方法。
【請求項１０】
第１のスポーンが期限までに実行を完了することができなかった結果としての中断を避けることを可能にするステップが、前記第１のスポーンが前記期限の時点でまだ実行されている場合に前記第１のスポーンにおいて第１の世代インジケータを第２の世代インジケータに変更することを含む、請求項９に記載の方法。
【請求項１１】
第１のノードが、ノードの世代インジケータを有し、方法が、スポーンを第２のノードにマイグレーションするマイグラントにさせるステップであって、前記第２のノードがノードの世代インジケータを有する、ステップをさらに含む、請求項１に記載の方法。
【請求項１２】
第２のノードのノードの世代インジケータが、前記第２のノードが第１のノードより若い世代であることを示し、方法が、マイグラントのノードの世代数を若くするステップをさらに含む、請求項１１に記載の方法。
【請求項１３】
マイグラントのノードの世代数を若くするステップが、前記マイグラントの入ってくるマイグレーション側での前記ノードの世代数の若返りを含む、請求項１２に記載の方法。
【請求項１４】
マイグラントのノードの世代数を若くするステップが、前記マイグラントの出て行くマイグレーション側での前記ノードの世代数の若返りを含む、請求項１２に記載の方法。
【請求項１５】
第１のノードが、各ノードがノードの世代数を有する複数ノードシステム内のノードであり、前記複数ノードシステムが、少なくとも第２のノードを含み、前記第２のノードが故障後にリカバリすると、前記第１のノードが前記第２のノードのノードの世代数に対応する状態にロールバックする、請求項１に記載の方法。
【請求項１６】
第１のノードが、各ノードがノードの世代数を有する複数ノードシステム内のノードであり、前記複数ノードシステムが、少なくとも第２のノードを含み、前記第１のノードが故障の後にリカバリすると、前記第１のノードが、チェックポイントからコミットされた作業を復元し、ジャーナルからコミットされていない作業を復元することによって前記第２のノードのノードの世代数に対応する状態にロールフォワードする、請求項１に記載の方法。
【請求項１７】
第１のノードが、各ノードがノードの世代数を有する複数ノードシステム内のノードであり、方法が、前記第１のノードにおいて、
チェックポイントが行われるべきであることを示すメッセージをマスタノードから受信するステップと、
応答して前記第１のノードのノードの世代数を若くするステップと、
スポーナがスポーンを生じさせることを中断させるステップと、
スポーナの状態をリカバリするためのスポーナリカバリ情報を保存するステップと、
前記スポーナを再開するステップと、
前記第１のノードにおいてさらなるより古い世代の入ってくるマイグラントが期待されないと決定するステップと、
前記決定に応答して、永続的ストレージに前記ノードのリカバリ情報をコミットするステップとを含む、請求項１に記載の方法。
【請求項１８】
期限を設定し、前記期限が経過すると、より若い世代のスポーンが実行を継続する一方でまだ実行されているすべてのより古い世代のスポーンを中断するステップをさらに含み、前記より古い世代のスポーン及び前記より若い世代のスポーンが特定の世代インジケータに相対する、請求項１７に記載の方法。
【請求項１９】
第１のノードが、複数ノードシステム内のノードであり、方法が、第２のノードにおいて前記第１のノードの作業メモリの複製コピーを保存し、前記第１のノードが故障すると、故障しなければ前記第１のノードによって行われたであろう処理のために前記複製コピーを一時的に使用し、前記第１のノードがリカバリすると、その後の計算が前記第１のノードによって行われ得るように前記第１のノードにおいてメモリを更新するために必要とされる情報を前記第１のノードに伝達するステップを含む、請求項１に記載の方法。
【請求項２０】
少なくとも１つの処理ノードを含むコンピューティングシステムにおいて耐障害及びリカバリを促進するためのソフトウェアを記憶する非一時的な媒体であって、前記ソフトウェアが、コンピューティングシステムに、第１のノードの可用性及びリカバリを促進させるための命令を含み、可用性及びリカバリを促進することが、前記第１のノードにおいて、
前記第１のノードにおいてスポーナを実行することであって、前記スポーナが、実行中に、第１のスポーンを生じさせ、
前記スポーナを実行することが、前記スポーナに第１の世代インジケータを割り当てることを含み、
前記第１のスポーンが、前記第１の世代インジケータを継承する、実行することと、
チェックポイント間隔を開始することであって、前記チェックポイント間隔の終わりに、前記第１のノードのリカバリのために使用可能であるノードのリカバリ情報が永続的ストレージにコミットされ、前記チェックポイント間隔を開始することが、
前記スポーナがスポーンを生じさせることを中断させること、
前記第１の世代インジケータとは異なる第２の世代インジケータを前記スポーナに割り当てること、
前記スポーナを再開し、それによって、前記スポーナが第２のスポーンを生じさせることを可能にすることであって、前記第２のスポーンが前記第２の世代インジケータを継承する、可能にすること、及び
前記第２のスポーンがメモリに書き込む範囲を制御することを含む、開始することと、
前記ノードのリカバリ情報をコミットした後、前記第２のスポーンがメモリに書き込むことができる前記範囲の制御を解放することとを含む、前記非一時的な媒体。
【請求項２１】
永続的ストレージを含むデータストレージシステムと、
第１のノードの可用性及びリカバリを促進するように構成された少なくとも１つのプロセッサを含む１又は２以上の処理ノードとを含むコンピューティングシステムであって、前記可用性及びリカバリを促進することが、前記第１のノードにおいて、
前記第１のノードにおいてスポーナを実行することであって、前記スポーナが、実行中に、第１のスポーンを生じさせ、
前記スポーナを実行することが、前記スポーナに第１の世代インジケータを割り当てることを含み、
前記第１のスポーンが、前記第１の世代インジケータを継承する、実行することと、
チェックポイント間隔を開始することであって、前記チェックポイント間隔の終わりに、前記第１のノードのリカバリのために使用可能であるノードのリカバリ情報が永続的ストレージにコミットされ、前記チェックポイント間隔を開始することが、
前記スポーナがスポーンを生じさせることを中断させること、
前記第１の世代インジケータとは異なる第２の世代インジケータを前記スポーナに割り当てること、
前記スポーナを再開し、それによって、前記スポーナが第２のスポーンを生じさせることを可能にすることであって、前記第２のスポーンが前記第２の世代インジケータを継承する、可能にすること、及び
前記第２のスポーンがメモリに書き込む範囲を制御することを含む、開始することと、
前記ノードのリカバリ情報をコミットした後、前記第２のスポーンがメモリに書き込むことができる前記範囲の制御を解放することとを含む、前記コンピューティングシステム。
【請求項２２】
永続的ストレージにデータを永続的に記憶するための手段；及び
第１のノードの可用性及びリカバリを促進する手段
を備える装置であって、前記可用性及びリカバリを促進することが、前記第１のノードにおいて、
前記第１のノードにおいてスポーナを実行することであって、前記スポーナが、実行中に、第１のスポーンを生じさせ、
前記スポーナを実行することが、前記スポーナに第１の世代インジケータを割り当てることを含み、
前記第１のスポーンが、第１の世代インジケータを継承する、実行することと；
チェックポイント間隔を開始することであって、前記チェックポイント間隔の終わりに、前記第１のノードのリカバリのために使用可能であるノードのリカバリ情報が永続的ストレージにコミットされ、前記チェックポイント間隔を開始することが、
前記スポーナがスポーンを生じさせることを中断させること、
前記第１の世代インジケータとは異なる第２の世代インジケータを前記スポーナに割り当てること、
前記スポーナを再開し、それによって、前記スポーナが第２のスポーンを生じさせることを可能にすることであって、前記第２のスポーンが前記第２の世代インジケータを継承する、可能にすること、及び
前記第２のスポーンがメモリに書き込む範囲を制御することを含む、開始することと；
前記ノードのリカバリ情報をコミットした後、前記第２のスポーンがメモリに書き込むことができる前記範囲の制御を解放することとを含む、前記装置。
【請求項２３】
第２のスポーンがメモリに書き込む範囲を制御することが、前記第２のスポーンが前記メモリへの書き込みを完了することを防止することを含む、請求項２０に記載の非一時的な媒体。
【請求項２４】
リカバリ情報がコミットされた後にメモリへの書き込みを最終的に完了するために、第２のスポーンがメモリへの前記書き込みをキューに入れることをコンピューティングシステムに許可させるための指示をさらに記憶する、請求項２３に記載の非一時的な媒体。
【請求項２５】
リカバリ情報がコミットされた後にメモリへの書き込みを最終的に完了するために、第２のスポーンがメモリへの前記書き込みをキューに入れることを許可するように、プロセッサがさらに構成されている、請求項２３に記載の非一時的な媒体。
【請求項２６】
第２のスポーンがメモリに書き込む範囲を制御することが、書き込み動作が交換可能な動作であると決定することと、前記交換可能な動作の完了を可能にすることとを含む、請求項２０に記載の非一時的な媒体。
【請求項２７】
書き込み動作が交換可能な動作であると決定することが、前記書き込み動作が変数をインクリメントすることを含むと決定することを含む、請求項２６に記載の非一時的な媒体。
【請求項２８】
書き込み動作が交換可能な動作であると決定することが、前記書き込み動作が指定された位置にレコードを挿入することを含むと決定することを含む、請求項２６に記載の非一時的な媒体。
【請求項２９】
スポーナを中断させた後コンピューティングシステムに期限を設定させ、それによって、第１の世代インジケータを有するすべてのスポーンが完了するまで実行されるための時間を提供し、前記第１の世代インジケータを有する前記スポーンの状態を保存しなくてはならないことに関連するオーバーヘッドを避けるための指示をさらに記憶する、請求項２０に記載の非一時的な媒体。
【請求項３０】
スポーナを中断させた後、期限を設定し、それによって、第１の世代インジケータを有するすべてのスポーンが完了するまで実行されるための時間を提供し、前記第１の世代インジケータを有する前記スポーンの状態を保存しなくてはならないことに関連するオーバーヘッドを避けるように、プロセッサがさらに構成されている、請求項２１に記載のコンピューティングシステム。
【請求項３１】
第１のスポーンが期限の時点でまだ実行されている場合に、コンピューティングシステムに前記第１のスポーンを中断させるための指示をさらに記憶する、請求項２９に記載の非一時的な媒体。
【請求項３２】
第１のスポーンが期限の時点でまだ実行されている場合に、前記第１のスポーンを中断するように、プロセッサがさらに構成されている、請求項３０に記載のコンピューティングシステム。
【請求項３３】
期限までに実行を完了することができなかった結果としての中断を第１のスポーンが避けることを、コンピューティングシステムに可能にさせるための指示をさらに記憶する、請求項２９に記載の非一時的な媒体。
【請求項３４】
期限までに実行を完了することができなかった結果としての中断を第１のスポーンが避けることを可能にするように、プロセッサがさらに構成されている、請求項３０に記載のコンピューティングシステム。
【請求項３５】
期限までに実行を完了することができなかった結果としての中断を第１のスポーンが避けることを可能にすることが、前記第１のスポーンが前記期限の時点でまだ実行されている場合に前記第１のスポーンにおいて第１の世代インジケータを第２の世代インジケータに変更することを含む、請求項３３に記載の非一時的な媒体。
【請求項３６】
第１のノードがノードの世代インジケータを有し、ソフトウェアが、スポーンを第２のノードにマイグレーションするマイグラントにさせる命令を更に含み、前記第２のノードがノードの世代インジケータを有する、請求項２０に記載の非一時的な媒体。
【請求項３７】
第２のノードのノードの世代インジケータが、前記第２のノードが第１のノードより若い世代であることを示し、ソフトウェアが、マイグラントのノードの世代数を若くする命令を更に含む、請求項３６に記載の非一時的な媒体。
【請求項３８】
マイグラントのノードの世代数を若くすることが、前記マイグラントの入ってくるマイグレーション側での前記ノードの世代数の若返りを含む、請求項３７に記載の非一時的な媒体。
【請求項３９】
マイグラントのノードの世代数を若くすることが、前記マイグラントの出て行くマイグレーション側での前記ノードの世代数の若返りを含む、請求項３７に記載の非一時的な媒体。
【請求項４０】
第１のノードが、各ノードがノードの世代数を有する複数ノードシステム内のノードであり、前記複数ノードシステムが、少なくとも第２のノードを含み、前記第２のノードが故障後にリカバリすると、前記第１のノードが前記第２のノードのノードの世代数に対応する状態にロールバックする、請求項２０に記載の非一時的な媒体。
【請求項４１】
第１のノードが、各ノードがノードの世代数を有する複数ノードシステム内のノードであり、前記複数ノードシステムが、少なくとも第２のノードを含み、前記第１のノードが故障の後にリカバリすると、前記第１のノードが、チェックポイントからコミットされた作業を復元し、ジャーナルからコミットされていない作業を復元することによって前記第２のノードのノードの世代数に対応する状態にロールフォワードする、請求項２０に記載の非一時的な媒体。
【請求項４２】
第１のノードが、各ノードがノードの世代数を有する複数ノードシステム内のノードであり、ソフトウェアが、前記第１のノードにおいて、
チェックポイントが行われるべきであることを示すメッセージをマスタノードから受信する命令と、
応答して前記第１のノードのノードの世代数を若くする命令と、
スポーナがスポーンを生じさせることを中断させる命令と、
スポーナの状態をリカバリするためのスポーナリカバリ情報を保存する命令と、
前記スポーナを再開する命令と、
前記第１のノードにおいてさらなるより古い世代の入ってくるマイグラントが期待されないと決定する命令と、
前記決定に応答して、永続的ストレージに前記ノードのリカバリ情報をコミットする命令とを更に含む、請求項２０に記載の非一時的な媒体。
【請求項４３】
コンピューティングシステムに、期限を設定させ、前記期限が経過すると、より若い世代のスポーンが実行を継続する一方でまだ実行されているすべてのより古い世代のスポーンを中断させるための指示をさらに記憶する非一時的な媒体であって、前記より古い世代のスポーン及び前記より若い世代のスポーンが特定の世代インジケータに相対する、請求項４２に記載の非一時的な媒体。
【請求項４４】
期限を設定し、前記期限が経過すると、より若い世代のスポーンが実行を継続する一方でまだ実行されているすべてのより古い世代のスポーンを中断するように、プロセッサがさらに構成されており、前記より古い世代のスポーン及び前記より若い世代のスポーンが特定の世代インジケータに相対している、請求項４２に記載の非一時的な媒体。
【請求項４５】
第１のノードが、複数ノードシステム内のノードであり、ソフトウェアが、第２のノードにおいて前記第１のノードの作業メモリの複製コピーを保存し、前記第１のノードが故障すると、故障しなければ前記第１のノードによって行われたであろう処理のために前記複製コピーを一時的に使用し、前記第１のノードがリカバリすると、その後の計算が前記第１のノードによって行われ得るように前記第１のノードにおいてメモリを更新するために必要とされる情報を前記第１のノードに伝達する命令を更に含む、請求項２０に記載の非一時的な媒体。
【請求項４６】
第２のスポーンがメモリに書き込む範囲を制御することが、前記第２のスポーンが前記メモリへの書き込みを完了することを防止することを含む、請求項２１に記載のコンピューティングシステム。
【請求項４７】
第２のスポーンがメモリに書き込む範囲を制御することが、書き込み動作が交換可能な動作であると決定することと、前記交換可能な動作の完了を可能にすることとを含む、請求項２１に記載のコンピューティングシステム。
【請求項４８】
書き込み動作が交換可能な動作であると決定することが、前記書き込み動作が変数をインクリメントすることを含むと決定することを含む、請求項４７に記載のコンピューティングシステム。
【請求項４９】
書き込み動作が交換可能な動作であると決定することが、前記書き込み動作が指定された位置にレコードを挿入することを含むと決定することを含む、請求項４７に記載のコンピューティングシステム。
【請求項５０】
期限までに実行を完了することができなかった結果としての中断を第１のスポーンが避けることを可能にすることが、前記第１のスポーンが前記期限の時点でまだ実行されている場合に前記第１のスポーンにおいて第１の世代インジケータを第２の世代インジケータに変更することを含む、請求項３４に記載のコンピューティングシステム。
【請求項５１】
第１のノードがノードの世代インジケータを有し、可用性及びリカバリを促進することが、スポーンを第２のノードにマイグレーションするマイグラントにさせることを更に含み、前記第２のノードがノードの世代インジケータを有する、請求項２１に記載のコンピューティングシステム。
【請求項５２】
第２のノードのノードの世代インジケータが、前記第２のノードが第１のノードより若い世代であることを示し、可用性及びリカバリを促進することが、マイグラントのノードの世代数を若くすることを更に含む、請求項５１に記載のコンピューティングシステム。
【請求項５３】
マイグラントのノードの世代数を若くすることが、前記マイグラントの入ってくるマイグレーション側での前記ノードの世代数の若返りを含む、請求項５２に記載のコンピューティングシステム。
【請求項５４】
マイグラントのノードの世代数を若くすることが、前記マイグラントの出て行くマイグレーション側での前記ノードの世代数の若返りを含む、請求項５２に記載のコンピューティングシステム。
【請求項５５】
第１のノードが、各ノードがノードの世代数を有する複数ノードシステム内のノードであり、前記複数ノードシステムが、少なくとも第２のノードを含み、前記第２のノードが故障後にリカバリすると、前記第１のノードが前記第２のノードのノードの世代数に対応する状態にロールバックする、請求項２１に記載のコンピューティングシステム。
【請求項５６】
第１のノードが、各ノードがノードの世代数を有する複数ノードシステム内のノードであり、前記複数ノードシステムが、少なくとも第２のノードを含み、前記第１のノードが故障の後にリカバリすると、前記第１のノードが、チェックポイントからコミットされた作業を復元し、ジャーナルからコミットされていない作業を復元することによって前記第２のノードのノードの世代数に対応する状態にロールフォワードする、請求項２１に記載のコンピューティングシステム。
【請求項５７】
第１のノードが、各ノードがノードの世代数を有する複数ノードシステム内のノードであり、可用性及びリカバリを促進することが、前記第１のノードにおいて、
チェックポイントが行われるべきであることを示すメッセージをマスタノードから受信することと、
応答して前記第１のノードのノードの世代数を若くすることと、
スポーナがスポーンを生じさせることを中断させることと、
スポーナの状態をリカバリするためのスポーナリカバリ情報を保存することと、
前記スポーナを再開することと、
前記第１のノードにおいてさらなるより古い世代の入ってくるマイグラントが期待されないと決定することと、
前記決定に応答して、永続的ストレージに前記ノードのリカバリ情報をコミットすることとを含む、請求項２１に記載のコンピューティングシステム。
【請求項５８】
第１のノードが、複数ノードシステム内のノードであり、可用性及びリカバリを促進することが、第２のノードにおいて前記第１のノードの作業メモリの複製コピーを保存し、前記第１のノードが故障すると、故障しなければ前記第１のノードによって行われたであろう処理のために前記複製コピーを一時的に使用し、前記第１のノードがリカバリすると、その後の計算が前記第１のノードによって行われ得るように前記第１のノードにおいてメモリを更新するために必要とされる情報を前記第１のノードに伝達することを含む、請求項２１に記載のコンピューティングシステム。
【発明の詳細な説明】
【技術分野】
【０００１】
関連出願の相互参照
本出願は、米国特許出願第６２／０６５，９４１号明細書の２０１４年１０月２０日の優先日の利益を主張するものであり、この米国特許出願の内容は、参照により本明細書に組み込まれる。
【０００２】
この説明は、計算の非決定性が存在する状況でのリカバリ及び耐障害に関する。
【背景技術】
【０００３】
計算システムは、さまざまな理由で故障することがある。そのようなシステムが故障するとき、データが失われる可能性がある。そのようなデータの喪失を防止するか又は少なくとも最小限にするための対策を取ることが望ましい。
【０００４】
そのような対策の例は、データベースの原子性、一貫性、コミットされるまでの独立性、コミットされるときの永続性（ＡＣＩＤ，Atomic, Consistent, Isolated until committed, Durable when committed）を含む。これらの知られている対策は、極めて堅牢である。これらの対策は、耐障害性も持たされながら、正確性の非常に高い基準を満たすようにされ得る。
【０００５】
しかし、この堅牢性のすべては、代償を伴う。故障を起こさないようにするための知られている方法は、レイテンシー(latency)が長く、ときには、装置が利用不可能である長い期間を引き起こす。したがって、これらの対策は、大量のトランザクションに関しては最善でない。
【０００６】
加えて、一部の知られている方法は、決定性の（deterministic）計算を必要とする。決定性の計算においては、タスクが実施される(performed)順序が決まっており、計算の結果は、計算が行われる(carried out)度に毎回同じである。これらの知られている方法が、どのようにして非決定性の計算環境を効率的に扱うように適合され得るのかは、はっきりしていない。
【０００７】
コンピューティング装置が互いに協力する複数の処理ノードを含むときには、さらなる複雑性が生じる。そのような装置においては、装置の１つのノードが故障し、その他のノードが動き続けることがあり得る。その故障したノードがリカバリするとき、これは、その他のノードがその故障したノードがそうであると期待する状態にその故障したノードが自身を復元したという保証にはならない。
【発明の概要】
【課題を解決するための手段】
【０００８】
一態様において、本発明は、少なくとも１つの処理ノードを含むコンピューティングシステムにおいて耐障害及びリカバリを促進するための方法を特徴とする。そのような方法は、第１の処理ノードの可用性及びリカバリを促進するステップであって、第１の処理ノードにおいて、ノードにおいてスポーナ（spawner）を実行することであって、スポーナが、実行中に、第１のスポーン（spawn）を生じさせ、スポーナを実行することが、スポーナに第１の世代インジケータを割り当てることを含み、第１のスポーンが、第１の世代インジケータを継承する、実行することと、チェックポイント間隔を開始することであって、チェックポイント間隔の終わりに、ノードのリカバリのために使用可能であるノードのリカバリ情報が永続的ストレージにコミットされ、チェックポイント間隔を開始することが、スポーナがスポーンを生じさせることを中断させること、第１の世代インジケータとは異なる第２の世代インジケータをスポーナに割り当てること、スポーナを再開し、それによって、スポーナが第２のスポーンを生じさせることを可能にすることであって、第２のスポーンが第２の世代インジケータを継承する、可能にすること、及び第２のスポーンがメモリに書き込む範囲（extent）を制御することを含む、開始することと、ノードのリカバリ情報をコミットした後、第２のスポーンがメモリに書き込むことができる範囲の制御を解放することとを含む、ステップを含む。
【０００９】
一部の実践においては、第２のスポーンがメモリに書き込む範囲を制御することが、第２のスポーンがメモリへの書き込みを完了することを防止することを含む。これらの中には、リカバリ情報がコミットされた後にメモリへの書き込みを最終的に完了するために第２のスポーンがメモリへの書き込みをキューに入れることを許すステップをさらに含む実践がある。
【００１０】
その他の実践においては、第２のスポーンがメモリに書き込む範囲を制御することが、書き込み動作が交換可能な動作であると決定することと、交換可能な動作の完了を可能にすることとを含む。これらの実践の中には、書き込み動作が交換可能な動作であると決定することが、書き込み動作が変数をインクリメントすること(incrementing)を含むと決定することを含む実践と、書き込み動作が交換可能な動作であると決定することが、書き込み動作が指定された位置にレコードを挿入することを含むと決定することを含む実践とがある。
【００１１】
また、本発明の実践の中には、スポーナを中断させた後、期限を設定し、それによって、第１のタスクの世代インジケータを有するすべてのスポーンが完了するまで実行されるための時間を提供し、第１の世代インジケータを有するスポーンの状態を保存しなくてはならないことに関連するオーバーヘッドを避けるステップをさらに含む実践がある。これらの実践の中には、第１のスポーンが期限の時点でまだ実行されている場合に第１のスポーンを中断するステップを含む実践と、例えば、第１のスポーンが期限の時点でまだ実行されている場合に第１のスポーンにおいて第１のタスクの世代インジケータを第２のタスクの世代インジケータに変更することによって第１のスポーンが期限までに実行を完了することができなかった結果としての中断を避けることを可能にするステップを含む実践とがある。
【００１２】
第１のノードが、ノードの世代インジケータを有する場合、本発明のさらなる実践は、スポーンを第２のノードにマイグレーションするマイグラント（migrant）にさせるステップであって、第２のノードがノードの世代インジケータを有する、ステップを含む。これらの実践の中には、第２のノードのノードの世代数が、第２のノードが第１のノードより若い世代であることを示し、その場合に、方法が、マイグラントの入ってくるマイグレーション側での若返り（immigration-side youthening）か、又はマイグラントの出て行くマイグレーション側での若返り（emigration-side youthening）かのどちらかによって、マイグラントを若くする（youthen）ステップをさらに含む実践がある。
【００１３】
場合によっては、第１のノードは、各ノードがノードの世代数を有する複数ノードシステム内のノードであり、複数ノードシステムは、少なくとも第２のノードを含む。これらの場合、第２のノードが故障後にリカバリすると、第１のノードが第２のノードのノードの世代数に対応する状態にロールバックする本発明の実践が存在する。
【００１４】
その他の場合、第１のノードは、各ノードがノードの世代数を有する複数ノードシステム内のノードであり、複数ノードシステムは、少なくとも第２のノードを含む。これらの場合、本発明の一部の実践は、第１のノードが故障後にリカバリすると、チェックポイントからコミットされた作業を復元し、ジャーナルからコミットされていない作業を復元することによって第２のノードのノードの世代数に対応する状態に第１のノードをロールフォワードさせるステップを含む。
【００１５】
第１のノードが、各ノードがノードの世代数を有する複数ノードシステム内のノードである場合、本発明の実践は、第１のノードが特定の行為を行う実践を含む。これらは、チェックポイントが行われるべきであることを示すメッセージをマスタノードから受信するステップと、応答して第１のノードのノードの世代数を若くするステップと、スポーナがスポーンを生じさせることを中断させるステップと、スポーナの状態をリカバリするためのスポーナリカバリ情報を保存するステップと、スポーナを再開するステップと、第１のノードにおいてさらなるより古い世代の入ってくるマイグラント（immigrant）が期待されないと決定するステップと、決定に応答して、永続的ストレージにノードのリカバリ情報をコミットするステップとを含む。これらの実践の中には、期限を設定し、期限が経過すると、より若い世代のスポーンが実行を継続する一方でまだ実行されているすべてのより古い世代のスポーンを中断するステップをさらに含む実践がある。
【００１６】
場合によっては、第１のノードは、複数ノードシステム内のノードである。そのような場合、本発明の代替的な実践は、第２のノードにおいて第１のノードの作業メモリの複製コピーを保存し、第１のノードが故障すると、故障しなければ第１のノードによって行われたであろう処理のために複製コピーを一時的に使用し、第１のノードがリカバリすると、その後の計算が第１のノードによって行われ得るように第１のノードにおいてメモリを更新するために必要とされる情報を第１のノードに伝達するステップを含む。
【００１７】
別の態様において、本発明は、コンピュータ可読媒体に非一時的形態に記憶され、実行されるときに、少なくとも１つの処理ノードを含むコンピューティングシステムにおいて耐障害及びリカバリを促進するソフトウェアを特徴とする。ソフトウェアは、コンピューティングシステムに、第１の処理ノードの可用性及びリカバリを促進させるための命令を有し、可用性及びリカバリを促進することが、第１の処理ノードにおいて、ノードにおいてスポーナを実行することであって、スポーナが、実行中に、第１のスポーンを生じさせ、スポーナを実行することが、スポーナに第１の世代インジケータを割り当てることを含み、第１のスポーンが、第１の世代インジケータを継承する、実行することと、チェックポイント間隔を開始することであって、チェックポイント間隔の終わりに、ノードのリカバリのために使用可能であるノードのリカバリ情報が永続的ストレージにコミットされ、チェックポイント間隔を開始することが、スポーナがスポーンを生じさせることを中断させること、第１の世代インジケータとは異なる第２の世代インジケータをスポーナに割り当てること、スポーナを再開し、それによって、スポーナが第２のスポーンを生じさせることを可能にすることであって、第２のスポーンが第２の世代インジケータを継承する、可能にすること、及び第２のスポーンがメモリに書き込む範囲を制御することを含む、開始することと、ノードのリカバリ情報をコミットした後、第２のスポーンがメモリに書き込むことができる範囲の制御を解放することとを含む。
【００１８】
さらに別の態様において、本発明は、永続的ストレージを含むデータストレージシステムと、第１の処理ノードの可用性及びリカバリを促進するように構成された少なくとも１つのプロセッサを含む１又は２以上の処理ノードであって、可用性及びリカバリを促進することが、第１の処理ノードにおいて、ノードにおいてスポーナを実行することであって、スポーナが、実行中に、第１のスポーンを生じさせ、スポーナを実行することが、スポーナに第１の世代インジケータを割り当てることを含み、第１のスポーンが、第１の世代インジケータを継承する、実行することと、チェックポイント間隔を開始することであって、チェックポイント間隔の終わりに、ノードのリカバリのために使用可能であるノードのリカバリ情報が永続的ストレージにコミットされ、チェックポイント間隔を開始することが、スポーナがスポーンを生じさせることを中断させること、第１の世代インジケータとは異なる第２の世代インジケータをスポーナに割り当てること、スポーナを再開し、それによって、スポーナが第２のスポーンを生じさせることを可能にすることであって、第２のスポーンが第２の世代インジケータを継承する、可能にすること、及び第２のスポーンがメモリに書き込む範囲を制御することを含む、開始することと、ノードのリカバリ情報をコミットした後、第２のスポーンがメモリに書き込むことができる範囲の制御を解放することとを含む、１又は２以上の処理ノードとを特徴とする。
【００１９】
態様は、以下の利点のうちの１又は２以上を有する可能性がある。
【００２０】
本明細書において説明される耐障害及びリカバリを促進するための技術は、コンピューティングシステムが可用性が高いままであることを可能にする。特定のＡＣＩＤの制約を戦略的に緩めることによって、コンピューティングシステムは、より極端な対策の大きなオーバーヘッドなしにリカバリ能力を提供し続けることができる。したがって、有用な作業のために利用され得るより多くのコンピューティングリソースが存在する。また、スポーン（例えば、オペレーティングシステムのプロセス又はスレッド）がメモリに書き込む範囲を制御することによって、耐障害メカニズムの完全性が維持されることを保証しながら、有用な作業が、チェックポイント間隔の間、引き続き実現され得る。したがって、これらの技術は、故障の際と正常な故障のない動作中との両方において、コンピューティングシステムの内部機能を拡張する。
【図面の簡単な説明】
【００２１】
【図１】計算の非決定性が存在する状況で耐障害及びリカバリを行うための単一ノードコンピューティング装置を示す図である。
【図２】図１のノードの動作中に遭遇されるチェックポイント間隔及び作動間隔（working interval）を示す図である。
【図３】スポーンが図２のチェックポイント間隔の間に完了するまで施行(run)されることを可能にされる方法を示す図である。
【図４】スポーンするプロセスが図２のチェックポイント間隔の間にスポーンを生じさせ続けることができる方法を示す図である。
【図５】メモリへの書き込みをキューに入れることによってスポーンがチェックポイント間隔の間作動し続けることができる方法を示す図である。
【図６】複数ノードコンピューティング装置を示す図である。
【図７】図７の装置からのノード内に同時に存在する２つの世代を示す図である。
【図８】チェックポイントメッセージに応答してスレーブノードによって行われる方法のステップを示す図である。
【図９】マイグラントの世代数をインクリメントすることを含む方法のステップを示す図である。
【図１０】故障後のリカバリのための方法のステップを示す図である。
【図１１】より迅速なリカバリを可能にするために別ノードに保有される複製を示す図である。
【図１２】迅速なリカバリのために図１１に示された複製を使用するための手順を示す図である。
【図１３】図９に示された複数のノードに関連した、図５に示された方法の実行の例を示す図である。
【発明を実施するための形態】
【００２２】
図１は、計算の非決定性が存在する状況での耐障害及びリカバリのための技術が使用され得るデータ処理システムの例を示す。データ処理システムは、作業メモリ１２を含むノード１０を有する単一ノードコンピューティング装置８を含む。ノード１０上で施行されるプロセス１４は、この作業メモリ１２を使用して、それらのプロセスのそれぞれのプロセスの状態を保存し、それらのプロセスのそれぞれの計算の中間的な結果を記憶する。異なる実施形態において、プロセス１４は、ノード１０上で施行されるオペレーティングシステム内のさまざまな種類のコンピューティングリソースのいずれかとして実装される可能性がある。例えば、プロセス１４は、独自のアドレス空間を有するオペレーティングシステムの「プロセス」として、又は独自の実行コンテキスト（例えば、ステージ（stage）、レジスタなど）を有するオペレーティングシステムの「スレッド」として、又は実施される動作のシーケンスを含むが、必ずしもそのタスクに専用の特定のオペレーティングシステムのプロセス若しくはスレッドを持たない何らかのその他の種類の「タスク」として実装される可能性がある。
【００２３】
作業メモリ１２は不揮発性であることが多いので、永続的ストレージ１６に記憶されるチェックポイントファイル１８にその作業メモリ１２の状態を周期的に保存することが賢明である。これらのチェックポイントファイル１８は、ノード１０の動作中に割り込みがある場合に状態情報を復元するために使用され得る。
【００２４】
ノード上で施行されるプロセス１４の中に、スポーナ２０がある。「スポーナ」は、特性の中でもとりわけ、１又は２以上のその他のプロセスを生じさせる能力を有する一種のプロセスである。スポーナによって生じさせられるプロセスは、本明細書においては、単数形と複数形との両方で「スポーン」と呼ばれる。そのようなスポーンを生じさせる行為は、動詞「スポーンする」の適切な変化形によって言及される。図１は、スポーン２２Ａ、２２Ｂを生じさせたスポーナ２０を示す。スポーナ２０は、概して、生存期間の長いプロセスであり、一方、スポーン２２Ａ、２２Ｂは、数が多いけれども、ずっと生存期間の短い傾向がある。場合によっては、スポーナは、そのスポーナによって生じさせられるスポーンよりも長く生存するプロセスである。また、スポーン２２Ａ、２２Ｂは、互いに独立しており、非同期であり、したがって、スポーン２２Ａ、２２Ｂがその計算を完了した範囲はスポーナ２０が最初にスポーン２２Ａ、２２Ｂを生じさせたときとは関係がない。結果として、スポーン２２Ａ、２２Ｂが計算を行う順序は不確定である。計算が行われる順序は、多くの場合、結果に影響を与える可能性があるので、これは、計算全体を不確定にする。
【００２５】
コンピューティング装置８の動作中に、コンピューティング装置８は、外界と通信する。例えば、コンピューティング装置８は、着信メッセージ２４の１又は２以上のストリームを受信し、送信メッセージ２８の１又は２以上のストリームを生成する可能性がある。以下でより詳細に説明されるように、これらのメッセージ２４、２８は、永続的ストレージ１６内に装置８によって一時的に記憶される。これらのメッセージ２４、２８は、物理的に及び／又は論理的に別れているそれぞれの領域内にエスクロー（escrow）のために一時的に記憶される可能性がある。着信メッセージ２４は、永続的ストレージ１６の着信メッセージエスクロー領域２６内に記憶される可能性があり、送信メッセージ２８は、永続的ストレージ１６の送信メッセージエスクロー領域３０内に記憶される可能性がある。
【００２６】
図２を参照すると、ノードの動作が、チェックポイント間隔３２及び作動間隔３４によって印を付けられる。作動間隔３４の間、ノードは、有用な作業をプロセスとして実施し、完了に向けて進める。チェックポイント間隔３２の間、ノード１０は、すべてのプロセスを中断し、それらのプロセスをシリアル化し、結果を永続的ストレージ１６に保存する。それから、ノード１０は、作業メモリ内にある他の任意のものを永続的ストレージ１６に保存する。この時点で、チェックポイントは、「コミットされた」と言われ、プロセス１４は、「チェックポイントを作成された」と言われる。
【００２７】
チェックポイント間隔３２は作動間隔３４よりもずっと短いことが好ましい。本明細書において説明される装置及び方法は、チェックポイント間隔３２の長さを短くすることによって作動間隔３４において実施され得る処理の量を増やすように意図される。
【００２８】
チェックポイントがコミットされると、ノード１０は、プロセス１４が再開することを可能にし、送信メッセージエスクロー領域３０内にある送信メッセージ２８をリリースする。
【００２９】
送信メッセージ２８を直ちに送信するのではなく送信メッセージエスクロー領域３０内に送信メッセージ２８を記憶することは、ノード１０の故障の結果として生じる可能性がある不整合を起こさないために役立つ。例えば、プロセス１４が一部の計算の結果を知らせる送信メッセージ２８を送信する可能性は、かなり高い。ノード１０が、このメッセージ２８が既に送信された後、ただし、計算結果が永続的ストレージ１６にコミットされる前に故障したとすると、ノード１０は、再起動し、コミットされていない計算を再実行することになる。完了すると、この第２の計算の結果を知らせる別のメッセージ２８が、送信される。２つの結果が異なる場合、これは非決定性の計算の場合には起こり難いことではなく、メッセージのうちの１つが無効になる。
【００３０】
具体的な例として、プロセス１４が乱数発生器の結果に基づいて顧客に賞を与える場合を考える。送信メッセージエスクロー領域３０がないと、プロセス１４は、賞が届こうとしていたことを知らせるメッセージ２８を第１の顧客に送信する。そのとき、ノード１０は、クラッシュし、再起動する。プロセス１４の状態が保存されなかったので、その顧客のいずれかの賞を与えられたという記録、又はプロセス１４が実行を正常に完了したという記録が存在しない。そして、ノード１０は、プロセス１４を再実行する可能性があり、プロセス１４は、それから、異なる乱数を生じさせ、したがって、賞が届こうとしていたことを知らせる第２のメッセージ２８を別の顧客に送信させる。これは、１つだけが意図されたものである２つの賞を与えるか、又は少なくとも１人の落胆した顧客をなんとかするかのどちらかを必要とする。
【００３１】
故障後にリカバリするために、ノード１０は、永続的ストレージ１６から、すべてのプロセス１４の状態及び作業メモリ１２の状態を取り出す。そして、ノード１０は、送信メッセージエスクロー領域３０内に記憶されるすべての送信メッセージ２８を再送信し、着信メッセージエスクロー領域１６から着信メッセージを処理のために取り出し、それから、生のデータに対する通常の動作を再開する。
【００３２】
送信メッセージエスクロー領域３０内のすべてのメッセージ２８の再送信は、受信者が重複したメッセージを受信する結果となり得る。一実施形態において、受信者は、繰り返されたメッセージ２８を無視するように構成される。別の実施形態においては、リカバリされると、受信者及びリカバリされたノード１０が、受信されたメッセージ２８を特定するために通信する。これは、ノード１０が重複したメッセージ２８を送信することを避けることを許す。
【００３３】
上述の手順は、長いチェックポイント間隔３２をもたらし、そして今度は、その長いチェックポイント間隔３２が、低いスループットか、又は着信メッセージの受信と対応する送信メッセージの生成との間の増加したレイテンシーかのどちらかを生じる可能性がある。さまざまな方法が、このレイテンシーを減らし及び／又はスループットを増やすために使用され得る。
【００３４】
第１の最適化方法は、バックグラウンドでのジャーナル３６の保守を特徴とする。リカバリ時にジャーナルのエントリが変更を再現するために使用され得るように、作業メモリ１２内のアイテムが変更される度に、対応するエントリがジャーナル３６に書き込まれる。ジャーナル３６は、永続的ストレージ１６に非同期に転送され得る。チェックポイント間隔３２の間、ノード１０は、すべてのジャーナルのエントリが確かに永続的にされたことを保証する。そのとき、リカバリは、作業メモリ１２のスナップショットを含むより古いチェックポイントファイル１８を使用し、ジャーナル３６に示されるように変更を適用することによって実現され得る。
【００３５】
この最適化は、リカバリするための時間を増加させることと引き換えにチェックポイント間隔３２の長さを短くする。特に、作業メモリ１２の最後の完全なイメージが取得されてからの時間が長くなればなるほど、ジャーナル３６内により多数のエントリが存在することになる。これは、リカバリ時間を増加させる。
【００３６】
第２の最適化方法は、ノード１０がほんのわずかなスポーンするプロセス２０を有するという事実に依拠し、それらのスポーンするプロセス２０の各々は、本明細書においては、単数形と複数形との両方で「スポーン２２Ａ、２２Ｂ」と呼ばれる多数の生存期間の短いプロセスを生じさせる（又は「スポーンする」）。
【００３７】
スポーン２２Ａ、２２Ｂの生存期間は、ランダムであるが、スポーナ２０の生存期間の期待される値よりもずっと短い期待される値を有する。したがって、チェックポイント中にスポーン２２Ａ、２２Ｂをシリアル化するのに時間を費やすことにはほとんど意味がない。実際、場合によっては、スポーン２２Ａ、２２Ｂをシリアル化するために必要とされる時間は、スポーンの期待される生存期間のうちのかなりの部分である。したがって、その代わりにスポーナ２０を中断し、そうして、新しいスポーンを生じさせることを防止し、そして、既存のスポーン２２Ａ、２２Ｂが思っていたとおりに終了することを可能にすることが有利であることが多い。
【００３８】
時間を節約するために、図３に示されるチェックポイント生成方法は、スポーナ２０を中断すること（ステップ３８）と、そのスポーナ２０をシリアル化すること（ステップ４０）とを含む。しかし、既存のスポーン２２Ａは、実行され続ける（ステップ４２）。そして、ほとんどのスポーン２２Ａが実行を終えることを可能にするのに十分なだけ長いが、レイテンシーにはっきり分かる影響を与えるほどには長くないように十分に長いアイドルして動かない期間を画定するために選択されるストラグラ（straggler）の期限の後（ステップ４６）、「進行の遅いスポーン（straggling spawn）」と呼ばれるまだ実行されているスポーンが、中断され（ステップ４８）、シリアル化される（ステップ５０）。
【００３９】
したがって、上述の方法は、シリアル化される必要があるプロセス１４の数を減らすことによってチェックポイント間隔３２の長さを短くする。上述の方法は、迅速に終了すると期待されるプロセス２２が迅速に終了することを可能にすることによってそのようにし、したがって、有効なチェックポイントを生成することの一部としてそれらのプロセス２２をシリアル化する必要をなくす。
【００４０】
第３の最適化手順は、防止されるべき害悪が、実際のところ、チェックポイント間隔３２中の作業メモリ１２に対する変更であるという認識から生じる。したがって、プロセス１４が実際には作業メモリ１２に書き込む必要がないが、その代わりに作業メモリ１２を読むことだけが必要である場合、そのプロセス１４を中断することには意味がない。
【００４１】
この第３の最適化手順を実装するために、ノード１０は、各プロセスに関連する世代数に依拠する。スポーナ２０はプロセスであるので、世代数を有する。スポーナのスポーン２２Ａ、２２Ｂもプロセスであるので、やはり世代数を有する。スポーン２２Ａと、そのスポーン２２Ａをスポーンしたスポーナ２０との世代数は、関連付けられる。特に、スポーン２２Ａ、２２Ｂの世代数は、スポーン２２Ａ、２２Ｂをスポーンしたスポーナ２０の世代数に等しい。スポーン２２Ａ、２２Ｂの世代数が、スポーン２２Ａ、２２Ｂをスポーンしたスポーナの世代数に関連付けられるか、又はスポーン２２Ａ、２２Ｂをスポーンしたスポーナの世代数から導出され得るようにする行為は、動詞「継承する」の適切な形によって説明される。特定の世代数を有するスポーナ２０がスポーン２２Ａ、２２Ｂを生じさせるとき、スポーン２２Ａ、２２Ｂは、スポーナの世代数を継承したと言われる。
【００４２】
動作中、チェックポイント間隔３２の開始前に、スポーナ２０が、より古い世代のスポーン２２Ａを生じさせたであろう。チェックポイント間隔３２の始めに、スポーナ２０は、「若くされる」。
【００４３】
動詞「若くする」並びにその変化形及び同語源語（cognate）は、整数に対して行われ得る特定の計算動作を示す。本明細書において使用されるとき、若くする動作が操作する特定の整数が世代数である。世代数に対して行われ得る動作を示す。
【００４４】
本明細書において説明される特定の例において、スポーナ２０を若くする行為は、そのスポーナ２０の世代数をインクリメントする行為を意味する。若くされた後、スポーナ２０は、チェックポイント間隔３２の間、スポーンを生じさせ続け、そのときだけ、より若い世代のスポーン２２Ｂを生じさせる。この結果は、ノード１０内に２種類のスポーン２２、すなわち、スポーナ２０が若くされる前に生じさせたより古い世代のスポーン２２Ａと、スポーナ２０が若くされた後に生じさせたより若い世代のスポーン２２Ｂとが共存することである。
【００４５】
図４を参照すると、チェックポイント間隔の始めに、中断されている間、スポーナ２０がいかなる新しいスポーンも生じさせず、そのスポーナ２０のプロセスの状態が保存される（ステップ５４）ように、スポーナ２０が中断される（ステップ５２）。それから、スポーナ２０は、そのスポーナ２０の世代数をインクリメントさせ（ステップ５６）、その後、再開する（つまり、中断を解除される）。再開した後、スポーナ２０は、またスポーン２２を生じさせることができるが、今度は、すべてのそのスポーナ２０のスポーン２２Ｂは、より若い世代のスポーンに入る。
【００４６】
作業メモリ１２に書き込もうと試みるいかなるより若い世代のスポーン２２Ｂも、チェックポイント間隔３２が完了されるまで遮断される。したがって、より若い世代のスポーン２２は、完了するまで施行され得ない。それらのより若い世代のスポーン２２は、初めて作業メモリ１２に実際に書き込むときまでのみ施行され得る。しかしながら、より若い世代のスポーン２２は、少なくとも完了への道を進み得る。これは、チェックポイント間隔３２の間であっても一部の処理が行われることを可能にする。
【００４７】
概して、チェックポイント間隔３２の間、メモリ１２内のすべてのプロセス１４がシリアル化される。しかし、図４の最適化方法においては、より古い世代のスポーン２２Ａのみをシリアル化することが望ましい。
【００４８】
世代数は、ノード１０がどのスポーンがより若い世代のスポーン２２Ｂであるかを特定し、したがって、それらの状態を保存することを避けることを可能にする。
【００４９】
残念なことに、すべてのより古い世代のスポーン２２Ａが終えられるか、又はストラグラの期限がより古い世代のスポーン２２Ａからのストラグラの中断をトリガするかのどちらかまで、より若い世代のスポーン２２Ｂが最大の速さで進むことができなかったので、より古い世代のスポーン２２Ａが処理を完了するのを待たなければならないことは、レイテンシーを増やす。
【００５０】
第２の最適化方法の変化形においては、作業メモリ１２を修正しようと試みるより若い世代のスポーン２２Ｂを遮断し、したがって、有用な作業を行い続ける機会を失う代わりに、ノード１０が、作業メモリ１２内の各データアイテムを世代番号によってタグ付けすることができる。より若い世代のスポーン２２Ｂがメモリロケーションを修正する場合、チェックポイントの後まで遮断するのではなく、ノード１０は、そのメモリロケーションの世代番号を更新することによってメモリロケーションを若くする。それから、古い世代のスポーン２２Ａがそのような若くされたメモリロケーションに対して読み取り又は書き込みを試みる場合、より古い世代のスポーン２２Ａは、そのより古い世代のスポーン２２Ａ自体を中断し、そのより古い世代のスポーン２２Ａの状態をチェックポイントに書き込み、そのより古い世代のスポーン２２Ａの世代番号を更新し、若くされた状態で実行を再開することによってそのより古い世代のスポーン２２Ａ自体を自発的に若くする。また、ノード１０は、スポーンのより古い世代に対応するジャーナルのエントリをスポーンのより若い世代に対応するジャーナルのエントリと区別することができるように、ジャーナルに書き込まれたエントリを世代番号によってタグ付けする。
【００５１】
第４の最適化方法は、より若い世代のスポーン２２Ｂがたとえ作業メモリ１２に対する最初に試みられた書き込みを過ぎても処理を継続することを可能にするという考えに依拠する。この方法は、ときどき計算結果が作業メモリ１２に書き込まれる順序が問題にならないことがあるという事実に依拠する。これに当てはまる場合、作業メモリ１２に対する書き込みは、単純に、後までキューに入れられる可能性がある。この方法は、より若い世代のスポーン２２Ｂが、作業メモリ１２に書き込む最初の試みの後でさえも、チェックポイント間隔３２の間、働き続けることを可能にする。
【００５２】
概して、プロセスが動作のシーケンスを行うときにはいつも、生じる疑問は、シーケンス中の動作の順序がシーケンスの結果に違いを生むのか否かである。このシーケンス内の動作は、シーケンス内のその動作の位置が結果に影響を与えない場合、「交換可能」であると言われる。そうでない場合、動作は、「交換不可能」である。交換可能な動作の例は、値をインクリメント又はデクリメントする命令、リストのある定義された位置にレコードを挿入する命令、及び概して、値を読み取ることが行われることを必要としないすべての動作である。第４の最適化方法は、これらの交換可能な動作を利用する。
【００５３】
ここで図５を参照すると、この第４の最適化方法において、ノード１０は、通常より若い世代のスポーン２２Ｂがメモリ１２に書き込むことを許されないときに、より若い世代のスポーン２２Ｂからの書き込み要求を受信する（ステップ６０）。しかし、この方法において、ノード１０は、交換可能な動作と交換不可能な動作とを区別する（ステップ６２）。提出された書き込みが交換可能である場合、ノード１０は、その書き込みをキューに入れる（ステップ６４）。それから、より若い世代のスポーン２２Ｂは、実行を続ける（ステップ６６）。これは、より若い世代のスポーン２２Ｂが作業メモリ１２に初めて書き込もうとした後も処理を継続することを可能にする。結果として、より若い世代のスポーン２２Ｂは、そのより若い世代のスポーン２２Ｂによって行われるすべての書き込み動作が交換可能である限り、チェックポイント間隔３２の間、実行され続ける。一方、提出された書き込みが交換不可能な書き込みである場合、ノード１０は、より若い世代のスポーン２２Ｂの実行を中断する（ステップ６８）。
【００５４】
交換不可能な書き込みに加えて、スポーン２２Ｂが、通常はそのように書き込むことができないときに、条件付きで書き込むことを許容され得るその他の条件が存在する可能性がある。１つのその他の例は、より若い世代のスポーン２２Ｂが、メモリ１２を調べた後、より古い世代のスポーン２２Ａによるいかなるさらなるメモリアクセスもあり得ないことを認識するときに生じる。
【００５５】
第５の最適化方法は、チェックポイント間隔３２が完了し、送信メッセージ２８を生じさせることに関連するすべての計算が永続的ストレージ１６にコミットされるまで送信メッセージエスクロー領域３０が送信メッセージ２８をリリースしないために生じるレイテンシーを減らす最適化方法である。送信メッセージエスクロー領域３０からメッセージ２８をリリースする前にチェックポイント間隔３２の終了まで待つという考えは、誤ったメッセージを送信する結果が重大である場合には有用である。しかし、誤ったメッセージを送信する結果がごく小さいが、遅らせられたメッセージを送信する結果が重大であるときがある。
【００５６】
例として、送信メッセージ２８が特定の小売店の品物のクーポンである場合を考える。ユーザが特定の時点でその特定の小売店の近くにいることを装置が検出したとものと仮定する。明らかに、ユーザが小売店を離れる機会を持つ前に直ちにメッセージ２８を送信することが望ましい。このメッセージ２８が送信メッセージエスクロー領域３０に棚上げされ、送信されるのを待っているものとすると、クーポンが有用になる機会が失われることになる。一方、そのクーポンがノード１０における故障が原因で後で失われる計算の結果であるものとすると、誰かが不満を言う可能性は低い。結局、店は、そうでなければ販売しなかった可能性がある販売をし、ユーザは、何らかの割引を受けて品物を手に入れたであろう。
【００５７】
送信メッセージ２８が基礎を成すデータが永続的ストレージ１６にコミットされるのを待つことなくリリースされるこの第５の最適化方法は、送信メッセージ２８を届ける際に時間が極めて重要であるということと、誤った又は一貫性のない送信メッセージ２８の代償がその送信メッセージ２８の遅い送達の悪影響に比べてごく小さいということとを前もって仮定する。第５の最適化方法において、送信メッセージ２８は、チェックポイント間隔３２の完了前に送信メッセージエスクロー領域３０からリリースされるか、又は送信メッセージエスクロー領域３０を完全に迂回する。
【００５８】
図６は、図１〜６に関連して説明される種類の複数のノード７２、７４、７６、７８が互いに通信し、データ処理を行う際に互いに協力する複数ノード装置７０を示す。そのような場合、タスクは、第１のノード７２から第２のノード７４にメッセージを送信する可能性がある。
【００５９】
場合によっては、メッセージは、第１のノード７２から第２のノード７４にタスクをマイグレーションする効果を有する可能性がある。あるノードから別のノードにマイグレーションするタスクは、「マイグラント」タスクと呼ばれる。視点に応じて、マイグラントタスクは、「入ってくるマイグラント（immigrant）」タスク又は「出て行くマイグラント（emigrant）」タスクのどちらかである。第１のノード７２の視点から見て、マイグラントタスクは、タスクが第１のノードを離れているので「出て行くマイグラント」タスクである。反対に、第２のノード７４の視点から見て、マイグラントタスクは、そのマイグラントタスクが第２のノード７４に到着しているので「入ってくるマイグラント」タスクである。
【００６０】
その他の場合、メッセージは、要求元のタスクが返信のメッセージを受信するまで先に進むことができないようなリモートプロシージャコール又はリモートデータアクセス要求である可能性がある。その他の場合、タスクは、メッセージを使用して第１のノード７２から第２のノード７４に情報を単純に非同期に送信し得る。例えば、参照により本明細書に組み込まれる、２０１５年９月２日に出願した、「EXECUTING GRAPH-BASED PROGRAM SPECIFICATIONS」と題した米国特許出願第１４／８４２，９５６号明細書に記載のものなどコンピューティングシステムが、本明細書において説明される耐障害及びリカバリを促進するための技術を使用して構成され得る。
【００６１】
そのような場合、上述の方法の応用は、第１のノード７２から第２のノード７６へのメッセージ８０が次のチェックポイント間隔３２の完了時にエスクローからリリースされるまで送信され得ないので、一部最善でない。これは、かなりのレイテンシーをもたらす。このレイテンシーは、複数ノード装置７０内でノードからノードへと送信されるメッセージをエスクローとして預託されることから除外することによって潜在的に減らされる可能性があるが、そのような除外は、非決定性が原因で十分でない。
【００６２】
例えば、多くの計算が非決定性であるので、複数のノード７２、７４、７６、７８が存在するとき、この及びその他の困難が生じる。そのような非決定性の計算の例は、結果が読み取り及び書き込みが行われる順序に依存する非決定性の計算、リアルタイムのクロックに依拠する非決定性の計算、並びに乱数発生器の出力に依拠する非決定性の計算であり、これらの非決定性の計算の例は、送信メッセージエスクロー領域３０の望ましさに関連して上で既に説明された。
【００６３】
第１のノード７２が第２のノード７４と通信し、それから、次のチェックポイント間隔３２の前に（例えば、故障が原因で）連絡することができなくなる場合、装置７０は、下のようにこの非決定性が原因で最終的に不整合を起こす可能性がある。故障の後、装置７０は、最も最近のチェックポイントから第１のノード７２をリカバリし、計算を再び始める。計算は、第１のノード７２から第２のノード７４へのメッセージの送信前の計算のある地点から再び始められる可能性がある。計算の非決定性の性質が原因で、第１のノード７２は、チェックポイントからのリカバリの後、第２のノード７４にまったく異なるメッセージをおそらく送信する可能性がある。しかし、その第２のノード７４は、元のメッセージを既に受信した可能性があり、潜在的に、２つのノード７２及び７４を一貫性のない状態にする。例えば、ノード７２は、ノード７４に「新しい」バージョンのメッセージを送信した状態にあるが、ノード７４は、「古い」バージョンのメッセージに既に働きかけた状態にある。さらに、ノード７４は、ノード７２から受信されたその元のメッセージに基づいてさらに別のノード７６にメッセージを送信した可能性があり、したがって、ノード７２及びノード７６も一貫性のない状態にある可能性がある。したがって、不整合が、ウィルスのように装置７０内のすべてのノードに広がる可能性がある。
【００６４】
上述の困難を避けるための１つの方法は、例えば、下のように「バリア同期（barrier sync）」動作を使用して、すべてのノード７２、７４、７６、７８がそれらのノードのチェックポイントを同期することを保証することである。「チェックポイントリーダー（checkpoint leader）」が、チェックポイント間隔を開始するようにすべてのノードに命じるメッセージをそれらのすべてのノードに送信する。そして、各チェックポイントが完了した後、各ノードが、チェックポイントリーダーに応答し、チェックポイントが完了していることを認める。チェックポイントリーダーは、すべてのノードから確認を受信したとき、チェックポイントをコミットし、それから処理を再開するようにすべてのノードに命じる。
【００６５】
この手法は、複数ノードのチェックポイントの問題に対する解決策の基礎を形成するが、２つの理由でその問題を完全に解決しない。第１に、複数ノード装置において、一部のノードが故障を切り抜ける可能性があり、その場合、切り抜けたノードは、それらのノードの現在の状態を（チェックポイントの状態にロールフォワードされるのではなく）チェックポイントの状態にロールバックされなければならない。第２に、チェックポイントが実施されるとき、運ばれている途中のメッセージが存在する可能性があり、そのことが、非決定性が古い処理間隔からチェックポイントを超えて新しい処理間隔へと漏れることを可能にする可能性がある。
【００６６】
単一ノード装置においては、ノード１０は、故障する場合、コミットされていない作業をリカバリするためにロールフォワードしさえすればよい。しかし、複数ノード装置７０において、ノード７８が故障するとき、故障しなかったその他のノード７２、７４、７６は、ロールバックを行う必要がある可能性がある。一部のノード７８をロールフォワードし、その他のノード７２、７４、７６をロールバックすることによって分散型の装置７０がリカバリするこのメカニズムは、実際に、すべてのノード７２、７４、７６、７８が同じチェックポイントにおいて再始動させられ得ることを意味する。したがって、結果として得られる装置７０は、すべてのノードに渡って同時に起こるチェックポイントの効果を達成する。しかし、装置７０は、上述のように困難であるすべてのノードに渡って動作を実際に同期しようとすることによってそのようにすることはしない。その代わりに、装置７０は、そのようなチェックポイントを実際に提供することを必要とせずに同期されたチェックポイントの恩恵を受けるためにノード７２、７４、７６、７８の状態を操作することによってそのようにする。
【００６７】
上述のリカバリ方法を実施するために、ノード７２、７４、７６、７８は、下で詳細に説明される分散型のチェックポイントの方法を実行する。図７を参照すると、分散型のチェックポイントの方法を実施するとき、あらゆるプロセス及びあらゆるメッセージが、世代数８２を獲得する。加えて、各チェックポイントに関連するタスクの実行数（running count）８４が保有される。また、各ノードは、そのノードのスポーナ２０のスポーナレジストリ８６を保有する。さらに、各ノード７２は、ノードの世代数８８を保有する。
【００６８】
ノードの世代数８８は、より若い世代のスポーン２２Ａによって行われる作業及びより古い世代のスポーン２２Ｂによって行われる作業が互いを妨げない世代ギャップ（generation gap）をノード７６が行うことを可能にする。世代ギャップの結果として、より古い世代及びより若い世代は、多かれ少なかれ互いを無視することができる。実際には、ノード７６は、２つの仮想マシンになり、一方の仮想マシンが、より古い世代のスポーン２２Ａによって見られ、別の仮想マシンが、より若い世代のスポーン２２Ｂによって見られる。これらの２つの仮想マシンは、同じ物理的なプラットフォーム上に共存するが、他の点では互いに直交している（orthogonal）。
【００６９】
加えて、各ノード７６は、ノード７６が必要に応じて特定の状態にロールフォワードするか又はロールバックすることを可能にする双方向ジャーナル９０も実装する。双方向ジャーナル９０は、作業ストレージ９２に対する変更、チェックポイントを作成されたタスクの状態のリスト９４、及びチェックポイントを作成されたメッセージ９６を含む。これらの要素は、時間的にロールフォワードするための方法を提供する。加えて、双方向ジャーナル９０は、ノード７６が時間的にロールバックすることを可能にするためのメモリ１２の取り消しログ（undo log）９８を特徴とする。概して、時間的にロールフォワードすることは、故障したノードがどのようにしてリカバリするかということである。時間的にロールバックすることは、装置７０内の別のノードが故障したときにノードが何をするかということである。
【００７０】
動作中、図６に示されるように、マスタノード７２は、チェックポイントメッセージ１００をすべてのその他のノード７４、７６、７８、すなわち、「スレーブノード」に送信し、チェックポイントが期限であることを示す。しかし、このチェックポイントがすべてのノード７２、７４、７６、７８において同時に起こる必要はない。
【００７１】
図８は、計算の非決定性が存在する状況での例示的な耐障害及びリカバリ手順に関する流れ図を示す。チェックポイントメッセージの受信に応答して（ステップ１０２）、スレーブノード７６は、チェックポイント間隔を直ちに開始しない。上述のように、これは、非実際的である。その代わりに、スレーブノード７６は、そのスレーブノード７６のノードの世代数８８をインクリメントし（ステップ１０４）、そのスレーブノード７６のノードの世代数８８のインクリメントを示すジャーナルのエントリを生成する（ステップ１０６）。
【００７２】
それから、スレーブノード７６は、そのスレーブノード７６のスポーナ２２のすべてを中断し（ステップ１０８）、それらのスポーナ２０の状態を双方向ジャーナル９０に書き込む（ステップ１１０）。そして、そのスレーブノード７６のスポーナ２０の各々に関して、スレーブノード７６は、そのスポーナの世代数８２をインクリメントする（ステップ１１２）。インクリメントされたそのスポーナの世代数８２を用いて、スポーナ２０は、動作を再開することを許容される（ステップ１１４）。しかし、スポーナの世代数８２がインクリメントされたであろうから、すべての結果として得られるスポーン２２Ｂは、より若い世代である。
【００７３】
この時点で、２つの世代が、スレーブノード７６内に共存する。より古い世代のスポーン２２Ａ、すなわち、ノードの世代数よりも１つ小さい世代数を有するスポーンは、完了するまで処理を継続し、必要に応じてメモリ１２に書き込む可能性がある。より若い世代のスポーン２２Ｂ、すなわち、世代数がノードの世代数８８に一致するスポーンは、メモリ１２に書き込むときまで処理し得る。その時点で、より若い世代のスポーン２２Ｂは、遮断される。
【００７４】
ここまでの説明においては、関連する２世代のみのスポーン、すなわち、世代数８２がノードの世代数８８よりも１つ小さいより古い世代のスポーン２２Ａと、世代数８２がノードの世代数８８に一致するより若い世代のスポーン２２Ｂとが存在することに留意されたい。しかし、原理的に、３つ以上の世代が同じプラットフォーム上に共存することができない理由はない。
【００７５】
図９を参照すると、複数ノード装置７０において、タスク７９が送信ノード７８から外にマイグレーションし、受信ノード７６の中にマイグレーションする可能性がある。図６に関連して説明されたように、そのようなタスク７９は、「マイグラントタスク」又は「マイグラント」と呼ばれる。
【００７６】
以下の検討においては、特定の目標に関連する値に言及する必要がある。図中の参照番号による曖昧さを避けるために、標準的な数学的な表記法と整合性のある方法で、括弧が、「〜の（of）」を意味するために使用される。したがって、「８８」が「ノードの世代数」に割り当てられ、「７６」がノードであるので、ノード７６のノードの世代数８８は、８８（７６）と書かれる。
【００７７】
マイグラントの世代数８２（７９）が受信ノード７６のノードの世代数８８（７６）と同じでないとき、困難が生じる可能性がある。これらの困難は、ノードの間にメッセージエスクロー領域を実装することによって避けられ得る。しかし、これは、最初に分散型のチェックポイントの方法が避けるように意図されたレイテンシーを再び招く。
【００７８】
分散型のチェックポイントの方法によれば、３つの起こり得ること、つまり、送信ノードのノードの数８８（７８）が受信ノードのノードの数８８（７６）と同じであることと、送信ノード７８が受信ノードのノードの数８８（７６）よりも小さなノードの世代数８８（７８）を有することと、送信ノード７８が受信ノードの８８（７６）よりも大きなノードの世代数８８（７８）を有することとが存在する。
【００７９】
第１の起こり得ることにおいて、マイグラントは、送信ノード７８のノードの数８８（７８）と同じ世代数８２（７９）を有する。したがって、送信ノード７８、受信ノード７６、及びマイグラント７９は、すべて同じ世代数を有する。その場合、特別なことは何も行われる必要がない。
【００８０】
第２の起こり得ることは、マイグラント７９が移動中である間に受信ノード７６がその受信ノード７６の世代数８８（７６）をインクリメントするときに生じる可能性がある。これは、受信ノード７６の中にマイグレーションすると、マイグラント７９が、今や受信ノード７６のより古い世代になるもののメンバーとしてそのマイグラント７９自体を示すことを意味する。その場合、受信ノード７６は、マイグラントの世代数８２（７９）をインクリメントすることによってマイグラント７９を若くする。結果として、マイグラントタスク７９は、処理を継続することができるが、より若い世代のスポーン２２Ｂの残りと同じように、メモリ１２への書き込みを遮断される。そのとき、マイグラント７９を若くすることは、受信ノード７６においてジャーナルに記録される。若くする行為は、受信ノード７６において行われるので、「入ってくるマイグラント側での若返り（immigrant-side youthening）」と呼ばれる。
【００８１】
第３の起こり得ることは、マイグラント７９が外にマイグレーションしたよりも前に送信ノード７８がその送信ノード７８の世代数８８（７８）をインクリメントするときに生じる可能性がある。その場合、送信ノード７８は、マイグラント７９が送信される前にマイグラントの世代数８２（７９）をインクリメントすることによってマイグラント７９を若くし、送信ノードにおいて若くするイベントをジャーナルに記録する。若くする行為は、送信ノード７８において行われるので、「出て行くマイグラント側での若返り（emigrant-side youthening）」と呼ばれる。
【００８２】
どちらの場合も、マスタノードからチェックポイントメッセージを受信したノード７６は、より古い世代のスポーン２２Ａが施行を終えることを可能にする期限を設定し、それによって、より古い世代の近々の消滅を保証し、それらの状態を記録する必要を避ける（ステップ１１６）。しかしながら、終了するのが遅いより古い世代のスポーン２２Ａが存在する可能性がある。期限が過ぎると、まだ実行されているすべてのより古い世代のスポーン２２が、中断され、シリアル化され、ジャーナルに記録され、若くされ、その後、そのより古い世代のスポーン２２は、作業メモリ１２が永続的ストレージ１６にコミットされた後まで作業メモリ１２に書き込まないという制約の下で実行を再開することを許容されるので、ノード７６が長い期間待つことは非現実的である。
【００８３】
スレーブノード７６は、より古い世代の入ってくるマイグラントが到着するともはや予測されないことが分かるまで実際のチェックポイントを開始しない。これを実施するために、ノード７２は、すべてのより古い世代の出て行くマイグラントが正常に外にマイグレーションしたと認識するときにはいつでも、すべてのその他のノード７４、７６、７８にフラッシュ（flush）メッセージをブロードキャストする。スレーブノード７６は、すべてのノード７２、７４、７８からフラッシュメッセージを受信すると、より古い世代の入ってくるマイグラントのフローが終息させられたことを知る（ステップ１１８）。より若い世代の入ってくるマイグラントは、より若い世代の出て行くマイグラントがスレーブノード７６から引き続き出て行く可能性あるのとまったく同様に、スレーブノード７６に引き続き到着する可能性がある。しかし、これらのより若い世代の出て行くマイグラントは、チェックポイントのプロセスとは関係がない。
【００８４】
この時点で、スレーブノード７６は、今や、そのスレーブノード７６の作業メモリ１２を永続的ストレージ１６にコミットする準備ができている（ステップ１２０）。これは、単一ノードの場合に関して上で説明された同じ方法で行われる。
【００８５】
図１０に示されるノードの故障後に再始動するための手順は、関連するノードが故障したノードであるか否かに依存する。再始動する命令を受信した（ステップ１２２）後、ノードは、そのノードが故障したノードであるかどうか、又は装置７０内の別のノードが故障したかどうかを決定する（ステップ１２４）。ノードは、故障したノードである場合、ログを取り出し、そのノードの最後の有効なチェックポイントからロールフォワードする（ステップ１２６）。ノードは、故障したノードではない場合、そのノードの最後のチェックポイントにロールバックする（ステップ１２８）。
【００８６】
「ロールバック」動作の例は、次のステップ、すなわち、（１）（スポーナとスポーンとの両方を含む）現在施行されているすべてのタスクを終了すること、（２）双方向ジャーナルのエントリを使用してメモリに対する任意の変更を元に戻すことを含む。
【００８７】
すべての故障したノードがロールフォワードされ、すべての故障を切り抜けたノードがロールバックされた後、装置７０は、タスクを再始動することの一部としてその他の動作を実施する可能性がある。例えば、装置７０は、次の動作、すなわち、（１）故障に先立つすべてのメッセージが破棄されたことを保証するために通信ネットワークをフラッシュすることと、（２）ジャーナルからタスクの保存された状態を取り出し、それらのタスクを再始動することによってチェックポイントの一部であったすべてのタスクを再始動することと、（３）チェックポイントの前に送信されたすべてのメッセージを再送信することと、（４）受信されたが、チェックポイントの時点でまだ処理されていなかったすべてのメッセージを処理することとを実施する可能性がある。
【００８８】
故障したノード上で最後の有効なチェックポイントからロールフォワードするタスクは、潜在的に時間がかかるタスクである。図１１を参照すると、一部の実践において、第２のノード１３４上に第１のノード１３２のメモリ１３０の複製１２８を保有することが有用である。好ましくは、第２のノード１３４は、第１のノード１３２と同じ故障モードを持たない。正常動作中に、複製１２８は、各チェックポイントにおいて第１のノード１３２のメモリ１３０と同期される。また、複製１２８は、その複製１２８が最も最近のチェックポイントにおけるその複製１２８の状態にロールバックすることを可能にする関連する取り消しログ１３６を有する。
【００８９】
ここで図１２を参照すると、第１のノード１３２が故障すると、第２のノード１２４の複製１２８がマスタとして指定される（ステップ１３８）。第２のノード１２４上のすべてのプロセスが強制終了され（ステップ１４０）、その後、第２のノード１３４が再始動される（ステップ１４２）。今やマスタコピーとして働く以前の複製１２８は、取り消しログ１３６の助けを借りて最後のチェックポイントまでロールバックされる（ステップ１４４）。それから、複数ノード装置７０の動作は、再開することができ、リカバリの待機は、ロールバック時間と大体同じ程度である。これは、概して、ロールフォワード時間よりもずっと短い。一方、リカバリされる第１のノード１３２は、複数ノード装置７０の全体のリカバリを遅くすることなく正しい状態へのロールフォワードへと進むことができる。第１のノード１３２は、準備ができると、再びマスタの役割を引き継ぎ、以前の複製１２８が、再び複製になる。
【００９０】
図１１は１つの第２のノード１３４のみを示すが、２つ以上の第２のノードが存在する可能性があり、それらの第２のノードの各々が複製１２８及び取り消しログ１３６を有することが理解される。その場合、第１のノード１３２が故障すると、第２のノードのうちの１つが、第１のノードのメモリの新しいマスタコピーの所有者として働くように選出されなければならない。
【００９１】
場合によっては、多くの冪等な動作（idempotent operation）が存在する可能性がある。そのような場合、ロールフォワードする代わりに、それらの計算がいかなる害も生じないので、冪等な動作を行う計算を単純に繰り返すことは不合理なことではない。
【００９２】
リカバリの最終結果は、すべての点がある世代から次の世代への遷移と整合性がある状態にあることである。結果として、古い世代のプロセスからのいかなる作業も失われないが、より若い世代のプロセスによってなされたすべての作業が失われる。これは、すべてのノードに渡って一貫性のある状態を保証する。この文脈で、状態は、いかなる障害もない状態でその状態が到達され得た場合、「一貫性がある」。対照的に、状態は、その状態が１又は２以上の障害の発生によってのみ説明され得る場合、「一貫性がない」。
【００９３】
図１３は、図６及び９に関連して言及された複数ノード装置７０内の送信ノード７８と受信ノード７６との両方におけるいくつかのスポーンされたプロセスの状態を示す。図１３において、時間は、縦軸に沿って下向きに増加する。時間軸は、第１の間隔１４６、第１の間隔１４６に続く第２の間隔１４８、及び第２の間隔１４８に続く第３の間隔１５０を示す。
【００９４】
図１３は、いくつかのスポーンされたプロセス２２Ａ〜Ｈを示し、それらのプロセス２２Ａ〜Ｈの各々は、関連する世代数を有する。世代数Ｎを有するスポーンは、本明細書においては「第１世代のスポーン」と呼ばれる。世代数Ｎ＋１を有するスポーンは、本明細書においては「第２世代のスポーン」と呼ばれる。形容詞「第１世代の」及び「第２世代の」は、ノード、マイグラントタスク、及びスポーンされたプロセスを含む、世代数によってタグ付けされるその他のエンティティを指すためにも使用される。
【００９５】
第１の間隔１４６の間、送信ノード７８は、第１世代のノードである。第２の及び第３の間隔１５０の間、送信ノード７８は、第２世代のノードである。ノードのこの進展は、第２の間隔１４８が第１の世代のために担っていたのと同じ役割を第２の世代のために担う間隔が第３の間隔１５０の後に続くように循環的であることに留意されたい。送信ノード７８において起こる進展と必ずしも同調していないが、この同じ進展が受信ノード７６において起こる。便宜上、送信ノード７８と受信ノード７６との両方における間隔を示すために同じ参照番号が使用される。しかし、これは、それらのノードが同期されることを示唆するように意図されていない。
【００９６】
第１の間隔１４６の間に、スポーンするプロセス２０は、さまざまな第１世代のスポーンされたプロセス２２Ａ〜２２Ｅをスポーンする。この第１の間隔１４６の間中は、いずれの第１世代のスポーンされたプロセス２２Ａ〜２２Ｅも、送信ノードのメモリ１２Ａに自由に書き込むことができる。
【００９７】
第２の間隔１４８の間、送信ノード７８は、第２世代のノードになる。したがって、スポーンするプロセス２０は、今や、第２世代のスポーンされたプロセスのみをスポーンする。この第２の間隔１４８の間は、いずれの第１世代のスポーンされたプロセス２２Ａ〜２２Ｅも、送信ノードのメモリ１２Ａに自由に書き込むことができるままである。第２世代のスポーンされたプロセス２２Ｆ〜２２Ｇは、自由に実行されるが、送信ノードのメモリ１２Ａへの書き込みを禁じられる。したがって、この第２の間隔１４８の目的は、すべての残っている第１世代のスポーン２２Ｃ、２２Ｄ、２２Ｅがチェックポイント間隔３２が発生する前にいつか実行を終えることを可能にすることである。
【００９８】
第３の間隔１５０の間、スポーンするプロセス２０は、別の第２世代のスポーンされたプロセス２２Ｈをスポーンする。この第３の間隔１５０の間は、いかなる第１世代のスポーンも残っておらず、すべての第２世代のスポーン２２Ｆ〜２２Ｈは送信ノードのメモリ１２Ａに自由に書き込むことができる。
【００９９】
送信ノード７８において、第１の第１世代のスポーンされたプロセス２２Ａ、第２の第１世代のスポーンされたプロセス２２Ｂ、第３の第１世代のスポーンされたプロセス２２Ｃ、第４の第１世代のスポーンされたプロセス２２Ｄ、及び第５の第１世代のスポーンされたプロセス２２Ｅは、すべて第１の間隔１４６の間に開始される。しかし、これらの中で、第１の第１世代のスポーンされたプロセス２２Ａ及び第２の第１世代のスポーンされたプロセス２２Ｂのみが、第１の間隔１４６の間にどうにか実行を終える。第３の第１世代のスポーンされたプロセス２２Ｃは、第２の間隔１４８の間にどうにか終了する。第４の第１世代のスポーンされたプロセス２２Ｄは、長く時間がかかり、第３の間隔１５０が既に始まるまでに終了することができない。第５の第１世代のスポーンされたプロセス２２Ｅは、送信ノード７８において実際に終了しない。その代わりに、第５の第１世代のスポーンされたプロセス２２Ｅは、第２の間隔１４８の途中で受信ノード７６にマイグレーションする。第５の第１世代のスポーンされたプロセス２２Ｅは、受信ノード７６がまだ独自の第２の間隔１４８にある間にそのようにする。
【０１００】
実行中、第１の第１世代のスポーンされたプロセス２２Ａは、第１の間隔１４６の間、送信ノードのメモリ１２Ａに書き込み、第３の第１世代のスポーンされたプロセス２２Ｃは、第２の間隔１４８の間、送信ノードのメモリ１２Ａに書き込む。第２の第１世代のスポーンされたプロセス２２Ｂは、実行中、送信ノードのメモリ１２Ａにまったく書き込まない。第５の第１世代のスポーンされたプロセス２２Ｅは、最終的に、送信ノードのメモリ１２Ａに書き込むが、受信ノード７６においてのみである。
【０１０１】
第２の間隔１４８の間に、第１の第２世代のスポーンされたプロセス２２Ｆと第２の第２世代のスポーンされたプロセス２２Ｇとの両方が実行を始める。第２の間隔１４８の間のあるときに、第１の第２世代のスポーンされたプロセス２２Ｆは、送信ノードのメモリ１２Ａに書き込まなければならない時点に達する。しかし、第１の第２世代のスポーンされたプロセス２２Ｆは、まだ第２の間隔１４８にあるので、送信ノードのメモリ１２Ａへの書き込みを禁じられる。したがって、第１の第２世代のスポーンされたプロセス２２Ｆは、破線によって示されるように中断される。第３の間隔１５０が始まると、第１の第２世代のスポーンされたプロセス２２Ｆは、送信ノードのメモリ１２Ａに書き込み、実行を完了する。
【０１０２】
一方、第２の第２世代のスポーンされたプロセス２２Ｇは、送信ノードのメモリ１２Ａに実際に書き込まなければならないときまでに第３の間隔１５０が既に始まっているように、第２の間隔１４８の間に十分に遅く始まった。したがって、第２の第２世代のスポーンされたプロセス２２Ｇは、中断なしに実行される。
【０１０３】
第３の第２世代のスポーンされたプロセス２２Ｈは、第３の間隔１５０の間に始まる。これは、本質的に、第１の第１世代のスポーンされたプロセス２２Ａのミラーイメージである。
【０１０４】
実行中に、第１の第１世代のスポーンされたプロセス２２Ａは、第１のタスク１５２を受信ノード７６にマイグレーションさせる。第１のタスク１５２は、第１の第１世代のスポーンされたプロセス２２Ａの世代番号を継承する。したがって、第１のタスク１５２は、第１世代のタスクとして存在し始める。この第１のタスク１５２は、受信ノード７６がまだ第１の間隔１４６において動作している間に受信ノード７６に到着する。したがって、受信ノード７６は、第１世代のノードとして働いている。したがって、第１のタスク１５２は、第３の間隔１５０が受信ノード７６において始まる前にそのようにするならば、自由に実行され、受信ノードのメモリ１２Ｂに書き込むことができる。
【０１０５】
やはり実行中に、第２の第１世代のスポーンされたプロセス２２Ｂは、第２のタスク１５４を受信ノード７６にマイグレーションさせる。第２のタスク１５４は、第１の第１世代のスポーンされたプロセス２２Ａの世代番号を継承する。したがって、第２のタスク１５４は、第１世代のタスクとして存在し始める。しかし、この第２のタスク１５４は、受信ノード７６がそのノードの第２の間隔１４８において既に動作している間に受信ノード７６に到着する。したがって、第２のタスク１５４は、第１世代のタスクから第２世代のタスクに変更される。これは、第２のタスク１５４を受信ノードのジャーナルファイル１５６に記録する付随するステップを含む。
【０１０６】
同様のイベントが、送信ノード７８において第５の第１世代のスポーンされたプロセス２２Ｅに関連して起こる。この第５の第１世代のスポーンされたプロセス２２Ｅは、実行の途中で受信ノード７６にマイグレーションする。しかし、第５の第１世代のスポーンされたプロセス２２Ｅが受信ノード７６に到着するまでに、受信ノード７６は、独自の第２の間隔１４８を既に開始した。したがって、第２のノードは、第２世代のノードになった。したがって、第５の第１世代のスポーンされたプロセス２２Ｅは、第２世代のスポーンされたプロセスに変更される。この変更は、第５の第１世代のスポーンされたプロセス２２Ｅを送信ノードのジャーナルファイル１５８に記録することによって達成される。そして、第５の第１世代のスポーンされたプロセス２２Ｅは、第２世代のスポーンされたプロセスとしてではあるが受信ノード７６上で実行を継続する。
【０１０７】
一方、再び送信ノード７８において、第４の第１世代のスポーンされたプロセス２２Ｄは、第２の間隔１４８の終了までに実行を終えなかった。この時点で、第４の第１世代のスポーンされたプロセス２２Ｄは、送信ノードのジャーナルファイル１５８に記録されており、かつその第４の第１世代のスポーンされたプロセス２２Ｄが今や第２世代のスポーンされたプロセスであるようにインクリメントされたそのプロセスの世代数を有している。そして、第４の第１世代のスポーンされたプロセス２２Ｄは、第３の間隔１５０の間、実行を続ける。
【０１０８】
第４の第１世代のスポーンされたプロセス２２Ｄは、受信ノード７６への第５の第１世代のスポーンされたプロセス２２Ｅのマイグレーション中にその第５の第１世代のスポーンされたプロセス２２Ｅによって維持された同じ２つのステップ、すなわち、ジャーナルに記録するステップ及び世代の変更を維持したことに留意されたい。したがって、第４の第１世代のスポーンされたプロセス２２Ｄが同じ意味でやはりマイグレーションしたと言うことは不合理なことではない。主な違いは、第５の第１世代のスポーンされたプロセス２２Ｅがノード間マイグレーションを経た一方、第４の第１世代のスポーンされたプロセス２２Ｄはノード内マイグレーションを経たということである。
【０１０９】
したがって、本明細書に記載のチェックポイント及びリカバリ方法は、複数のノードに渡ってチェックポイントを同時に実行することの望ましさが、時間的同時性にではなく、むしろ時間的同時性の副次的作用に根ざすという認識に基づく。そのため、方法は、複数のノードに渡るチェックポイントの時間的同時性の副次的効果を、実際にそれを実現する必要なしに再現する。
【０１１０】
上述の耐障害及びリカバリ手法は、例えば、好適なソフトウェア命令を実行するプログラミング可能なコンピューティングシステムを用いて実装される可能性があり、又はフィールドプログラマブルゲートアレイ（ＦＰＧＡ，field-programmable gate array）などの好適なハードウェアで、若しくは何らかの混成の形態で実装される可能性がある。例えば、プログラミングされる手法において、ソフトウェアは、それぞれが少なくとも１つのプロセッサ、（揮発性及び／又は不揮発性メモリ及び／又はストレージ要素を含む）少なくとも１つのデータストレージシステム、（少なくとも１つの入力デバイス又はポートを用いて入力を受け取るため、及び少なくとも１つの出力デバイス又はポートを用いて出力を与えるための）少なくとも１つのユーザインターフェースを含む（分散、クライアント／サーバ、又はグリッドなどのさまざまなアーキテクチャである可能性がある）１又は２以上のプログラミングされた又はプログラミング可能なコンピューティングシステム上で実行される１又は２以上のコンピュータプログラムのプロシージャを含み得る。ソフトウェアは、例えば、データフローグラフの設計、構成、及び実行に関連するサービスを提供するより大きなプログラムの１又は２以上のモジュールを含む可能性がある。プログラムのモジュール（例えば、データフローグラフの要素）は、データリポジトリに記憶されたデータモデルに準拠するデータ構造又はその他の編成されたデータとして実装され得る。
【０１１１】
ソフトウェアは、ある期間（例えば、ダイナミックＲＡＭなどのダイナミックメモリデバイスのリフレッシュ周期の間の時間）媒体の物理特性（例えば、表面ピット及びランド、磁区、又は電荷）を使用して、揮発性若しくは不揮発性ストレージ媒体又は任意のその他の非一時的媒体に具現化されるなど、非一時的形態で記憶され得る。命令をロードするのに備えて、ソフトウェアは、ＣＤ−ＲＯＭ又は（例えば、多目的若しくは専用のコンピューティングシステム若しくはデバイスによって読み取り可能な）その他のコンピュータ可読媒体などの有形の非一時的媒体上に提供される可能性があり、或いはそのソフトウェアが実行されるコンピューティングシステムの有形の非一時的媒体にネットワークの通信媒体を介して配信される（例えば、伝搬信号に符号化される）可能性がある。処理の一部又はすべては、専用のコンピュータで、又はコプロセッサ若しくはフィールドプログラマブルゲートアレイ（ＦＰＧＡ）若しくは専用の特定用途向け集積回路（ＡＳＩＣ，application-specific integrated circuit）などの専用のハードウェアを使用して実施される可能性がある。処理は、ソフトウェアによって規定された計算の異なる部分が異なるコンピューティング要素によって実施される分散された方法で実装される可能性がある。それぞれのそのようなコンピュータプログラムは、本明細書において説明された処理を実施するためにストレージデバイスの媒体がコンピュータによって読み取られるときにコンピュータを構成し、動作させるために、多目的又は専用のプログラミング可能なコンピュータによってアクセスされ得るストレージデバイスのコンピュータ可読ストレージ媒体（例えば、ソリッドステートメモリ若しくは媒体、又は磁気式若しくは光学式媒体）に記憶されるか又はダウンロードされることが好ましい。本発明のシステムは、コンピュータプログラムで構成された有形の非一時的媒体として実装されると考えられる可能性もあり、そのように構成された媒体は、本明細書において説明された処理ステップのうちの１又は２以上を実施するために特定の予め定義された方法でコンピュータを動作させる。
【０１１２】
本発明のいくつかの実施形態が、説明された。しかしながら、上述の説明は、添付の請求項の範囲によって画定される本発明の範囲を例示するように意図されており、限定するように意図されていないことを理解されたい。したがって、その他の実施形態も、添付の請求項の範囲内にある。例えば、本発明の範囲を逸脱することなくさまざまな修正がなされ得る。さらに、上述のステップの一部は、順序に依存しない可能性があり、したがって、説明された順序とは異なる順序で実施される可能性がある。
【０１１３】
本発明を説明したが、我々が新しいものであると主張し、特許証（letters patent）によって保証されるのは、以下のものである。
【図１】
0006313907.tif 000002
【図２】
0006313907.tif 000003
【図３】
0006313907.tif 000004
【図４】
0006313907.tif 000005
【図５】
0006313907.tif 000006
【図６】
0006313907.tif 000007
【図７】
0006313907.tif 000008
【図８】
0006313907.tif 000009
【図９】
0006313907.tif 000010
【図１０】
0006313907.tif 000011
【図１１】
0006313907.tif 000012
【図１２】
0006313907.tif 000013
【図１３】
0006313907.tif 000014