(57)【要約】【課題】ジャーナリングを用いて、障害発生時におけるファイルシステムのデータとメタデータの双方の整合性を確保するとともに、ジャーナリングに伴う書き込み量を削減することにより、ファイルシステムの書き込み性能を向上させる。【解決手段】永続メモリ２００は、データと、メタデータと、データとメタデータの更新履歴であるジャーナルログと、を格納する。また、ジャーナルログ制御部１１０は、書き込み要求があった場合に、書き込み要求に伴うデータとメタデータの更新履歴をジャーナルログに格納するジャーナリング処理と、ジャーナルログに格納された更新履歴を確定させるコミット処理と、ジャーナルログに格納された確定した更新履歴をデータやメタデータに反映させるチェックポイント処理と、チェックポイント処理を遅延させる遅延チェックポイント処理と、の実行を制御する。【選択図】図１
2019003288.tif 000002
【特許請求の範囲】
【請求項１】
データと、メタデータと、前記データと前記メタデータの更新履歴であるジャーナルログと、を格納する永続メモリに格納された前記ジャーナルログの制御を行うジャーナルログ制御システムであって、
書き込み要求があった場合に、前記書き込み要求に伴うデータとメタデータの更新履歴を前記ジャーナルログに格納するジャーナリング処理と、
前記ジャーナルログに格納された更新履歴を確定させるコミット処理と、
前記ジャーナルログに格納された確定した更新履歴を前記データや前記メタデータに反映させるチェックポイント処理と、
前記チェックポイント処理を遅延させる遅延チェックポイント処理と、
の実行を制御するジャーナルログ制御部を備えることを特徴とするジャーナルログ制御システム。
【請求項２】
前記ジャーナルログ制御部は、チェックポイント処理を遅延させているジャーナルログ内のログエントリにおける書き込みデータのサイズが所定の閾値未満である場合には、前記ジャーナルログ内のログエントリにおける書き込みデータをファイルに反映させ、所定の閾値以上である場合には、前記ジャーナルログ内のログエントリにおける書き込みデータを格納しているページを、ファイルのデータを格納するページとして用いることを特徴とする請求項１に記載のジャーナルログ制御システム。
【請求項３】
データと、メタデータと、前記データと前記メタデータの更新履歴であるジャーナルログと、を格納する永続メモリに格納された前記ジャーナルログの制御を行うコンピュータによって実行されるジャーナルログ制御方法であって、
書き込み要求があった場合に、前記書き込み要求に伴うデータとメタデータの更新履歴を前記ジャーナルログに格納するジャーナリング処理と、
前記ジャーナルログに格納された更新履歴を確定させるコミット処理と、
前記ジャーナルログに格納された確定した更新履歴を前記データや前記メタデータに反映させるチェックポイント処理と、
前記チェックポイント処理を遅延させる遅延チェックポイント処理と、
を含んだことを特徴とするジャーナルログ制御方法。
【請求項４】
チェックポイント処理を遅延させているジャーナルログ内のログエントリにおける書き込みデータのサイズが所定の閾値未満である場合には、前記ジャーナルログ内のログエントリにおける書き込みデータをファイルに反映させ、所定の閾値以上である場合には、前記ジャーナルログ内のログエントリにおける書き込みデータを格納しているページを、ファイルのデータを格納するページとして用いることを特徴とする請求項３に記載のジャーナルログ制御方法。
【請求項５】
データと、メタデータと、前記データと前記メタデータの更新履歴であるジャーナルログと、を格納する永続メモリに格納された前記ジャーナルログの制御を行うコンピュータに、
書き込み要求があった場合に、前記書き込み要求に伴うデータとメタデータの更新履歴を前記ジャーナルログに格納するジャーナリング処理と、
前記ジャーナルログに格納された更新履歴を確定させるコミット処理と、
前記ジャーナルログに格納された確定した更新履歴を前記データや前記メタデータに反映させるチェックポイント処理と、
前記チェックポイント処理を遅延させる遅延チェックポイント処理と、
を実行させることを特徴とするジャーナルログ制御プログラム。
【請求項６】
チェックポイント処理を遅延させているジャーナルログ内のログエントリにおける書き込みデータのサイズが所定の閾値未満である場合には、前記ジャーナルログ内のログエントリにおける書き込みデータをファイルに反映させ、所定の閾値以上である場合には、前記ジャーナルログ内のログエントリにおける書き込みデータを格納しているページを、ファイルのデータを格納するページとして用いることを特徴とする請求項５に記載のジャーナルログ制御プログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、ジャーナルログ制御システム、ジャーナルログ制御方法およびジャーナルログ制御プログラムに関する。
【背景技術】
【０００２】
近年、永続メモリ（Persistent  Memory）が実用化されつつある。永続メモリは高速、不揮発、バイト単位でアドレス可能といった特徴を持つ。永続メモリの例としては、相変化メモリ（Phase  Change  Memory（PCM））、スピン注入磁気メモリ（Spin  Transfer  Torque  Magnetic  Random  Access  Memory（STT-MRAM））、抵抗変化メモリ（Resistive  Random  Access  Memory（ReRAM））などがある。また、Non-Volatile  Dual  In-line  Memory  Module（NVDIMM）が製品化されている。
【０００３】
従来のファイルシステムはハードディスクドライブ（Hard  Disk  Drive（以降、ＨＤＤ）やソリッドステートドライブ（Solid  State  Drive（以降、ＳＳＤ））の利用を前提としているため、ＨＤＤやＳＳＤとは性能や特性が大きく異なる永続メモリの利用には適していない。そのため、永続メモリ向けファイルシステムが提案されている。永続メモリ向けファイルシステムの例としては、PMFS（非特許文献１参照）、BPFS（非特許文献２参照）、NOVA（非特許文献３参照）、Shortcut-JFS（非特許文献４参照）、Ext4（非特許文献５参照）、XFS（非特許文献６参照）などがある。
【０００４】
前述した永続メモリ向けファイルシステムでは、ファイルシステムのデータやメタデータの整合性を確保するためにジャーナリング、コピーオンライト、ログ構造化のいずれか、もしくは複数の技術を用いている。
【０００５】
ジャーナリングでは、データを更新する前にジャーナルログに更新を書き込む。ジャーナルログへの更新の書き込みが確定したのちに、更新をファイルシステム本体に反映させるチェックポイントと呼ばれる処理を実行する。障害発生時には、ジャーナルログを用いてファイルシステムを整合性のある状態に復旧させることができる。
【０００６】
コピーオンライトでは、書き込み対象のブロックを新たに割り当てたブロックにコピーし、コピーされたブロックに対して更新を行う。ファイルシステムを上書きすることがないため、ファイルシステムの整合性を常に確保することができる。
【０００７】
ログ構造化では、ファイルシステムのデータ構造を連続的なログとして保存する。ファイルシステムの更新は上書きされず、ログの論理的な末尾に追記されるため、ファイルシステムの整合性を常に確保することができる。
【先行技術文献】
【非特許文献】
【０００８】
【非特許文献１】Subramanya  R  Dulloor,  Sanjay  Kumar,  Anil  Keshavamurthy,  Philip  Lantz,  Dheeraj  Reddy,  Rajesh  Sankaran,  Jeff  Jackson,  System  Software  for  Persistent  Memory,  Proceedings  of  the  Ninth  European  Conference  on  Computer  Systems,  April,  2014.
【非特許文献２】Jeremy  Condit,  Edmund  B.  Nightingale,  Christopher  Frost,  Engin  Ipek,  Benjamin  Lee,  Doug  Burger,  Derrick  Coetzee,  Better  I/O  Through  Byte-Addressable,  Persistent  Memory,  Proceedings  of  the  ACM  SIGOPS  22nd  Symposium  on  Operating  Systems  Principles,  October,  2009.
【非特許文献３】Jian  Xu,  Steven  Swanson,  NOVA:  A  Log-structured  File  System  for  Hybrid  Volatile/Non-volatile  Main  Memories,  Proceedings  of  the  14th  USENIX  Conference  on  File  and  Storage  Technologies,  February,  2016.
【非特許文献４】Eunji  Lee,  Seunghoon  Yoo,  Jee-Eun  Jang,  Hyokyung  Bahn,  Shortcut-JFS:  A  Write  Efficient  Journaling  File  System  for  Phase  Change  Memory,  Proceedings  of  IEEE  28th  Symposium  on  Mass  Storage  Systems  and  Technologies,  April,  2012.
【非特許文献５】Matthew  Wilcox,  Support  ext4  on  NV-DIMMs,  ［平成２９年３月１４日検索］、インターネット＜https://lwn.net/Articles/588218/＞
【非特許文献６】Dave  Chinner,  xfs:  DAX  support,  ［平成２９年３月１４日検索］、インターネット＜http://oss.sgi.com/pipermail/xfs/2015-March/040804.html＞
【発明の概要】
【発明が解決しようとする課題】
【０００９】
ジャーナリング、コピーオンライト、ログ構造化のいずれか、もしくは複数の技術を用いることにより、ファイルシステムの整合性を確保することが可能である。しかし、ジャーナリングでは、更新をジャーナルログとファイルシステム本体への反映の２回書き込む必要があり、また、コピーオンライトやログ構造化では、更新したデータブロックからファイルシステムのルートまでの連鎖的な更新が必要となるため、書き込み量が増加し、ファイルシステムの書き込み性能が低下してしまうという問題がある。
【課題を解決するための手段】
【００１０】
上述した課題を解決するために、本発明のジャーナルログ制御システムは、データと、メタデータと、前記データと前記メタデータの更新履歴であるジャーナルログと、を格納する永続メモリに格納された前記ジャーナルログの制御を行うジャーナルログ制御システムであって、書き込み要求があった場合に、前記書き込み要求に伴うデータとメタデータの更新履歴を前記ジャーナルログに格納するジャーナリング処理と、前記ジャーナルログに格納された更新履歴を確定させるコミット処理と、前記ジャーナルログに格納された確定した更新履歴を前記データや前記メタデータに反映させるチェックポイント処理と、前記チェックポイント処理を遅延させる遅延チェックポイント処理と、の実行を制御するジャーナルログ制御部を備えることを特徴とする。
【発明の効果】
【００１１】
本発明によれば、ジャーナリングを用いて、障害発生時におけるファイルシステムのデータとメタデータの双方の整合性を確保するとともに、ジャーナリングに伴う書き込み量を削減することにより、ファイルシステムの書き込み性能を向上させることができるという効果を奏する。
【図面の簡単な説明】
【００１２】
【図１】図１は、第１の実施形態における本発明を適用したシステム全体の構成の一例を示す図である。
【図２】図２は、第１の実施形態におけるジャーナルログの構成の一例を示す図である。
【図３】図３は、第１の実施形態におけるログエントリの構成の一例を示す図である。
【図４】図４は、第１の実施形態におけるデータ書き込みログエントリの構成の一例を示す図である。
【図５】図５は、第１の実施形態におけるデータ追記書き込みログエントリの構成の一例を示す図である。
【図６】図６は、第１の実施形態におけるログページ終端ログエントリの構成の一例を示す図である。
【図７】図７は、第１の実施形態における書き込み処理の動作の一例を示すフローチャートである。
【図８】図８は、第１の実施形態におけるジャーナリング処理の動作の一例を示すフローチャートである。
【図９】図９は、第１の実施形態におけるデータ書き込みログエントリ追加処理の動作の一例を示すフローチャートである。
【図１０】図１０は、第１の実施形態におけるデータ追記書き込みログエントリ追加処理の動作の一例を示すフローチャートである。
【図１１】図１１は、第１の実施形態におけるログエントリ領域確保処理の動作の一例を示すフローチャートである。
【図１２】図１２は、第１の実施形態におけるコミット処理の動作の一例を示すフローチャートである。
【図１３】図１３は、第１の実施形態におけるチェックポイント処理の動作の一例を示すフローチャートである。
【図１４】図１４は、第１の実施形態におけるデータ書き込みログエントリのチェックポイント処理の動作の一例を示すフローチャートである。
【図１５】図１５は、第１の実施形態におけるログエントリポインタ更新処理の動作の一例を示すフローチャートである。
【図１６】図１６は、第１の実施形態におけるデータ書き込みログエントリの遅延チェックポイント処理の動作の一例を示すフローチャートである。
【図１７】図１７は、第１の実施形態における始点ポインタ更新処理の動作の一例を示すフローチャートである。
【発明を実施するための形態】
【００１３】
以下に添付図面を参照して、この発明に係るジャーナルログ制御システム、ジャーナルログ制御方法およびジャーナルログ制御プログラムの実施形態を説明する。なお、この実施形態により、この発明が限定されるものではない。
【００１４】
［第１の実施形態における本発明を適用したシステム全体の構成の一例］
図１は、第１の実施形態における本発明を適用したシステム全体の構成の一例を示す図である。図１に示すように、本発明を適用したシステム１０は、ファイルシステム１００および永続メモリ２００を有する。ファイルシステム１００は、例えば、ＣＰＵ（Central  Processing  Unit）が所定のプログラムに従って処理を実行することによって実現される。また、永続メモリ２００は、例えば、相変化メモリ、スピン注入磁気メモリ、抵抗変化メモリ等である。また、本発明のジャーナルログ制御システムには、少なくともジャーナルログ制御部１１０が含まれる。
【００１５】
ファイルシステム１００はジャーナルログ制御部１１０と、空き領域管理部１２０とで構成される。ジャーナルログ制御部１１０は、ファイル書き込みやファイル属性変更などのユーザからの要求に伴う更新のジャーナルログへの書き込み処理と、ジャーナルログ内の更新内容を確定させるコミット処理と、ジャーナルログ内の更新内容をファイルシステム本体に反映させるチェックポイント処理とを実行する。空き領域管理部１２０は永続メモリ２００の割り当て処理と解放処理とを実行する。永続メモリ２００の領域はページと呼ばれる一定サイズ（以降、ページサイズ）の単位に分割して管理される。空き領域管理部１２０はページ単位で永続メモリ２００内の領域の割り当てと解放とを行う。なお、図１には本発明の第１の実施形態の説明に必要な構成要素のみを示しており、ファイルシステム１００はその他の構成要素を有していてもよい。
【００１６】
従来のＨＤＤやＳＳＤ向けジャーナリングファイルシステムでは、ファイルシステム作成時に、ＨＤＤやＳＳＤ上の連続した領域をジャーナルログとして静的に割り当てる。一方、永続メモリは高速なランダムアクセスが可能であるため、本発明の第１の実施形態では、永続メモリの領域のページを動的に割り当て、解放を行い、ジャーナルログは、ページの連結リストとして構成することとする。ジャーナルログを構成する各ページ（以降、ログページ）は更新内容を示すログエントリを保持する。なお、従来のＨＤＤやＳＳＤ上のジャーナリングファイルシステムのように、ファイルシステム作成時に永続メモリの特定の領域をジャーナルログとして静的に割り当てるようにしてもよい。
【００１７】
図２は、第１の実施形態におけるジャーナルログの構成の一例を示す図である。図２の例では、ジャーナルログ３００は、ログページ３１０、３２０、３３０で構成されている。ジャーナルログ３００の最後のログページ以外のログページ３１０、３２０の末尾には、次のログページのアドレスを保持する。ジャーナルログ３００の最後のログページ３３０の末尾には、次のログページが存在しないことを示すヌルを保持する。ログページ３１０、３２０、３３０はログエントリを保持する。ログページ３１０は、ログエントリ３１１、３１２、３１３を、ログページ３２０は、ログエントリ３２１、３２２、３２３、３２４、３２５を、ログページ３３０は、ログエントリ３３１を、それぞれ保持している。
【００１８】
ジャーナルログ３００は、始点ポインタ３４０、終点ポインタ３５０、挿入ポインタ３６０で管理される。始点ポインタ３４０は、ジャーナルログ３００内において、チェックポイント処理が完了したログエントリの位置を示している。また、終点ポインタ３５０は、ジャーナルログ内において、コミット処理が完了したログエントリの位置を示している。図２の例では、始点ポインタ３４０と終点ポインタ３５０の間にあるログエントリ３１１、３１２、３１３、３２１、３２２は、コミット処理は完了しているが、チェックポイント処理はまだ完了していないログエントリである。
【００１９】
新しいログエントリは、挿入ポインタ３６０の位置に追加される。ジャーナルログ３００に新しいログエントリが追加されると、挿入ポインタ３６０は、当該新しいログエントリの次の位置を示すように更新される。挿入ポインタ３６０の位置のログページに、当該新しいログエントリを保持するのに必要な空き領域がないときは、ジャーナルログ制御部１１０は、空き領域管理部１２０に空きページの割り当てを要求して新しい空きページを取得する。次に、ジャーナルログ制御部１１０は、当該ログページの末尾に当該新しいログページのアドレスを保持して、当該新しいログページをジャーナルログ３００の連結リストにつなぎ、挿入ポインタ３６０の位置に、ログページ内の以降の領域にはログエントリが存在しないことを示す特別なログエントリを追加する。最後に、ジャーナルログ３００は、当該新しいログページの先頭に当該ログエントリを追加し、挿入ポインタ３６０を当該ログエントリの次の位置を示すように更新する。図２の例では、終点ポインタ３５０と挿入ポインタ３６０の間にあるログエントリ３２３、３２４、３２５、３３１は、ジャーナルログ３００への追加処理は完了したが、コミット処理はまだ完了していないログエントリである。
【００２０】
ファイル書き込みやファイル属性変更などの操作に伴うログエントリの追加処理がすべて完了して、当該操作が確定すると、ジャーナルログ制御部１１０は、当該ログエントリをコミットし、終点ポインタ３５０を、挿入ポインタ３６０の位置を示すように更新する。
【００２１】
コミット処理が完了すると、ジャーナルログ制御部１１０は、チェックポイント処理を実行し、コミットしたジャーナルログ３００内の各ログエントリを、ファイルシステム本体に反映させる。
【００２２】
チェックポイント処理が完了すると、ジャーナルログ制御部１１０は、始点ポインタ３４０を、チェックポイント処理が完了した最後のログエントリの次の位置を示すように更新する。ログページが保持するすべてのログエントリのチェックポイント処理が完了すると、ジャーナルログ制御部１１０は、ジャーナルログ３００の連結リストから当該ログページを外し、空き領域管理部１２０に当該ログページの解放を要求して当該ログページを解放する。
【００２３】
図３は、第１の実施形態におけるログエントリの構成の一例を示す図である。ログエントリ４００はヘッダ部４１０とデータ部４２０とで構成される。ヘッダ部４１０は、ログエントリの種別（以降、ログエントリ種別）を保持する。ログエントリ種別としては、ファイルのデータ書き込みに関するログエントリであるデータ書き込みログエントリ、ファイルのデータ追記書き込みに関するログエントリであるデータ追記書き込みログエントリ、メタデータの更新に関するログエントリであるメタデータ更新ログエントリがある。また、ログページ内の以降の領域にはログエントリが存在しないことを示すログエントリであるログページ終端ログエントリがある。その他のログエントリ種別を用意してもよい。また、ヘッダ部４１０はログエントリに関するその他の情報を保持してもよい。データ部４２０は、ログエントリのヘッダ部４１０に保持されるログエントリ種別によって、保持する情報やサイズが異なる。データ部４２０は存在しなくてもよい。
【００２４】
図４は、第１の実施形態におけるデータ書き込みログエントリの構成の一例を示す図である。書き込みデータに対して、１ページごとに１つのデータ書き込みログエントリ５００が使用される。データ書き込みログエントリ５００のヘッダ部５１０は、ログエントリ種別がデータ書き込みログエントリであることを示す情報であるデータ書き込みログエントリ識別情報５１１を保持する。データ書き込みログエントリ５００のデータ部５２０は、書き込みデータを直接保持するのではなく、別途、書き込みデータページ５２１を割り当てて、当該書き込みデータページ５２１に書き込みデータを保持する。
【００２５】
データ書き込みログエントリ５００のデータ部５２０は、書き込みデータを保持する書き込みデータページ５２１（以降、書き込みデータページ）のアドレス５２２（以降、書き込みデータページアドレス）、当該書き込みデータにおけるファイルの先頭からのオフセット５２３（以降、ファイル内オフセット）、当該書き込みデータにおける書き込みデータページ５２１の先頭からのオフセット５２４（以降、書き込みデータページ内オフセット）、当該書き込みデータのデータサイズ５２５（以降、書き込みデータサイズ）、当該書き込みデータの反映先であるデータページ（以降、反映先データページ）のアドレス（以降、反映先データページアドレス）を保持するメタデータページにおける、当該反映先データページアドレスを保持しているメモリ位置のアドレス５２６（以降、反映先データページアドレス保持アドレス）を保持する。データ書き込みログエントリ５００はその他の情報を保持してもよい。
【００２６】
図５は、第１の実施形態におけるデータ追記書き込みログエントリの構成の一例を示す図である。データ追記書き込みログエントリ６００は、前回のファイル書き込み操作において、当該ファイル書き込みの範囲の一部またはすべてに対して遅延チェックポイント処理が実行されていて、かつ、当該遅延チェックポイント処理によりチェックポイント処理を遅延させている書き込みデータの範囲の末尾に対して、今回のファイル書き込み操作における、書き込みデータの範囲が連続しているときに使用される。当該書き込みデータは、チェックポイント処理を遅延させているデータ書き込みログエントリの書き込みデータページに保持される。遅延チェックポイント処理については後述する。
【００２７】
データ追記書き込みログエントリ６００のヘッダ部６１０は、ログエントリ種別がデータ追記書き込みログエントリであることを示す情報であるデータ追記書き込みログエントリ識別情報６１１を保持する。データ追記書き込みログエントリ６００のデータ部６２０は、追記書き込みデータのデータサイズ６２１（以降、追記書き込みデータサイズ）、を保持する。データ追記書き込みログエントリ６００はその他の情報を保持してもよい。
【００２８】
図６は、第１の実施形態におけるログページ終端ログエントリの構成の一例を示す図である。ログページ終端ログエントリ７００のヘッダ部７１０は、ログエントリ種別がログページ終端ログエントリであることを示す情報であるログページ終端ログエントリ識別情報７１１を保持する。ログページ終端ログエントリ７００はデータ部を有しない。
【００２９】
本発明の第１の実施形態は、メタデータの構造や内容には依存しないため、メタデータ更新ログエントリの構造や内容については説明を省略する。
【００３０】
[第１の実施形態における書き込み処理の一例]
第１の実施形態における書き込み処理は、ジャーナリング処理と、コミット処理と、チェックポイント処理とで構成される。書き込み処理の概要を以下に説明する。ジャーナリング処理において、データ書き込みログエントリを用いて、書き込みデータをジャーナルログに保持する。書き込みはページ単位で処理する。コミット処理において、当該書き込みを確定させる。チェックポイント処理において、書き込みデータがデータ書き込みログエントリの書き込みデータページの末尾に到達していないときは、当該データ書き込みログエントリをジャーナルログの末尾に追加しなおすことで、当該データ書き込みログエントリの遅延チェックポイント処理を実行する。
【００３１】
続く書き込みのジャーナリング処理において、前回の書き込みでデータ書き込みログエントリの遅延チェックポイント処理が実行されていて、かつ、当該データ書き込みログエントリの遅延チェックポイント処理によりチェックポイントを遅延させている書き込みデータの範囲の末尾に対して、今回の書き込みデータの範囲が連続しているならば、データ追記書き込みログエントリを用いて、当該書き込みデータをジャーナルログに保持する。一方、前回の書き込みでデータ書き込みログエントリの遅延チェックポイント処理が実行されているが、当該データ書き込みログエントリの遅延チェックポイント処理によりチェックポイントを遅延させている書き込みデータの範囲の末尾に対して、今回の書き込みデータの範囲が連続していないならば、当該データ書き込みログエントリのチェックポイント処理を実行する。
【００３２】
続く書き込みのチェックポイント処理において、データ書き込みログエントリとデータ追記書き込みログエントリが存在するときは、当該データ書き込みログエントリと当該データ追記書き込みログエントリを統合して一つのデータ書き込みログエントリとしてジャーナルログの末尾に追加しなおすことで、遅延チェックポイント処理を実行する。チェックポイント処理において、書き込みデータが、データ書き込みログエントリの書き込みデータページの末尾に達しているときは、当該データ書き込みエントリのチェックポイント処理を実行する。
【００３３】
書き込みに伴ってメタデータを更新する場合は、メタデータ更新ログエントリのジャーナリング処理と、コミット処理と、チェックポイント処理とが必要となるが、前述したとおり、本発明の第１の実施形態では、メタデータの構造や内容については説明を省略しているため、以降の説明において、メタデータ更新ログエントリのジャーナリング処理と、コミット処理と、チェックポイント処理との詳細については説明を省略する。
【００３４】
図７は、第１の実施形態における書き込み処理の動作の一例を示すフローチャートである。書き込み処理では、ジャーナルログ制御部１１０は、書き込むべきデータである書き込みデータと、書き込みデータ全体のサイズ（以降、全書き込みデータサイズ）と、書き込みデータを書き込むファイル内の位置（以降、書き込み位置）とを受け取る。
【００３５】
初めに、ジャーナルログ制御部１１０は、ジャーナリング処理を実行する（ステップＳ７０１）。ジャーナリング処理については後述する。ジャーナリング処理が完了すると、ジャーナルログ制御部１１０は、コミット処理を実行する（ステップＳ７０２）。コミット処理については後述する。コミット処理が完了すると、ジャーナルログ制御部１１０は、遅延チェックポイントフラグを真にして、チェックポイント処理を実行する（ステップＳ７０３）。遅延チェックポイントフラグは、データ書き込みログエントリのチェックポイント処理を遅延させるか否かを示すフラグである。チェックポイント処理については後述する。
【００３６】
[第１の実施形態におけるジャーナリング処理の一例]
図８は、第１の実施形態におけるジャーナリング処理の動作の一例を示すフローチャートである。初めに、ジャーナルログ制御部１１０は、ジャーナルログ内にデータ書き込みログエントリが存在すれば、ステップＳ８０２へ、そうでなければ、ステップＳ８０７へ遷移する（ステップＳ８０１）。
【００３７】
ジャーナルログ内にデータ書き込みログエントリが存在するとき、ジャーナルログ制御部１１０は、書き込み範囲が当該データ書き込みログエントリの保持する書き込みデータの範囲の末尾に連続、すなわち、書き込み位置が、当該データ書き込みログエントリのファイル内オフセットの値と当該データ書き込みログエントリの書き込みデータサイズの値の合計に等しいならば、ステップＳ８０３へ、そうでなければ、ステップＳ８０６へ遷移する（ステップＳ８０２）。
【００３８】
書き込み範囲がデータ書き込みログエントリの保持する書き込みデータの範囲の末尾に連続のとき、ジャーナルログ制御部１１０は、データ追記書き込みログエントリ追加処理を実行する（ステップＳ８０３）。データ追記書き込みログエントリ追加処理については後述する。
【００３９】
次に、ジャーナルログ制御部１１０は、ステップＳ８０３で追記したデータサイズを書き込み位置に加算し（ステップＳ８０４）、当該追記したデータサイズを全書き込みサイズから減算する（ステップＳ８０５）。
【００４０】
書き込み範囲が当該データ書き込みログエントリの保持する書き込みデータの範囲の末尾に連続でないとき、すなわち、書き込み位置が、当該データ書き込みログエントリのファイル内オフセットの値と当該データ書き込みログエントリの書き込みデータサイズの値の合計に等しくないとき、ジャーナルログ制御部１１０は、遅延チェックポイントフラグを偽にしてチェックポイント処理を実行する（ステップＳ８０６）。チェックポイント処理については後述する。
【００４１】
ジャーナルログ制御部１１０は、書き込み位置以降の書き込み範囲内の各データページに対して、ステップＳ８０７からステップＳ８１１の処理を実行する。ジャーナルログ制御部１１０は、全書き込みサイズが０ならば、ステップＳ８１２へ、そうでなければ、ステップＳ８０８へ遷移する（ステップＳ８０７）。全書き込みサイズが０でないとき、ジャーナルログ制御部１１０は、書き込み位置のデータページのアドレスを保持するメタデータに対するメタデータ更新ログエントリ追加処理を実行する（ステップＳ８０８）。ここでは、当該書き込み位置のデータページのアドレスの更新に伴うメタデータの更新などを想定しているが、メタデータ更新ログエントリ追加処理の要否を含めて、前述のとおり、メタデータ更新ログエントリ追加処理の詳細については説明を省略する。
【００４２】
ジャーナルログ制御部１１０は、書き込み位置のデータページに対するデータ書き込みログエントリ追加処理を実行する（ステップＳ８０９）。データ書き込みログエントリ追加処理については後述する。
【００４３】
次に、ジャーナルログ制御部１１０は、ステップＳ８０９で書き込んだデータサイズ分を書き込み位置に加算し（ステップＳ８１０）、当該データサイズ分を全書き込みサイズから減算する（ステップＳ８１１）。
【００４４】
最後に、全書き込みサイズが０のとき、ジャーナルログ制御部１１０は、ファイル全体のメタデータに対するメタデータ更新ログエントリ追加処理を実行する（ステップＳ８１２）。ここでは、ファイル更新時間の更新などを想定しているが、メタデータ更新ログエントリ追加処理の要否を含めて、前述のとおり、メタデータ更新ログエントリ追加処理の詳細については説明を省略する。
【００４５】
[第１の実施形態におけるデータ書き込みログエントリ追加処理]
図９は、第１の実施形態におけるデータ書き込みログエントリ追加処理の動作の一例を示すフローチャートである。初めに、ジャーナルログ制御部１１０は、ログエントリ領域確保処理を実行し、ジャーナルログ内に、データ書き込みログエントリを追加するための空き領域を確保する（ステップＳ９０１）。ログエントリ領域確保処理については後述する。
【００４６】
次に、ジャーナルログ制御部１１０は、ステップＳ９０２からステップＳ９０５で、データ書き込みログエントリのデータ部に保持する情報を取得する。ジャーナルログ制御部１１０は、空き領域管理部１２０に空きページの割り当てを要求して空きページを取得し、当該空きページをデータ書き込みログエントリの書き込みデータページ、当該空きページのアドレスをデータ書き込みログエントリの書き込みデータページアドレスとする（ステップＳ９０２）。
【００４７】
ジャーナルログ制御部１１０は、書き込み対象のファイルのメタデータを探索して、書き込み位置に対応するデータページのアドレスを保持するメタデータページにおける、当該データページのアドレスを保持しているメモリ位置のアドレスを取得し、当該アドレスをデータ書き込みログエントリの反映先データページアドレス保持アドレスとする（ステップＳ９０３）。
【００４８】
ジャーナルログ制御部１１０は、書き込み位置をページサイズで除算した剰余を計算し、当該剰余の値をデータ書き込みログエントリの書き込みデータページ内オフセットとする（ステップＳ９０４）。
【００４９】
ジャーナルログ制御部１１０は、ページサイズからステップＳ９０４で取得したデータ書き込みログエントリの書き込みデータページ内オフセットを減算した値と、全書き込みサイズとの最小値を計算し、当該最小値をデータ書き込みログエントリの書き込みデータサイズとする（ステップＳ９０５）。
【００５０】
ジャーナルログ制御部１１０は、当該書き込みログエントリの書き込みデータページにおける、当該データ書き込みログエントリの書き込みデータページ内オフセットの位置に、当該データ書き込みログエントリの書き込みデータサイズ分、書き込みデータを書き込む（ステップＳ９０６）。
【００５１】
ジャーナルログ制御部１１０は、ログエントリ種別がデータ書き込みログエントリであることを示す情報であるデータ書き込みログエントリ識別情報と、当該書き込みログエントリの書き込みデータページアドレスと、当該書き込みログエントリの反映先データページアドレス保持アドレスと、当該書き込みログエントリの書き込みデータページ内オフセットと、当該書き込みログエントリの書き込みデータサイズとによりデータ書き込みログエントリを作成し、挿入ポインタの位置に、当該データ書き込みログエントリを追加する（ステップＳ９０７）。最後に、ジャーナルログ制御部１１０は、挿入ポインタを、ステップＳ９０７で書き込んだ当該データ書き込みログエントリの次の位置に設定する（ステップＳ９０８）。
【００５２】
[第１の実施形態におけるデータ追記書き込みログエントリ追加処理]
図１０は、第１の実施形態におけるデータ追記書き込みログエントリ追加処理の動作の一例を示すフローチャートである。初めに、ジャーナルログ制御部１１０は、ログエントリ領域確保処理を実行し、ジャーナルログ内に、データ追記書き込みログエントリを追加するための空き領域を確保する（ステップＳ１００１）。ログエントリ領域確保処理については後述する。
【００５３】
ジャーナルログ制御部１１０は、ジャーナルログ内に存在するデータ書き込みログエントリのデータページ内オフセットと書き込みデータサイズとを加算した値をページサイズから減算した値と、現在の全書き込みサイズとの最小値を計算し、当該最小値をデータ追記書き込みログエントリの書き込みデータサイズとする（ステップＳ１００２）。
【００５４】
ジャーナルログ制御部１１０は、ジャーナルログ内に存在するデータ書き込みログエントリの書き込みデータページにおける、データ書き込みログエントリのデータページ内オフセットと書き込みデータサイズとを加算した値の位置に、当該データ追記書き込みログエントリの書き込みデータサイズ分、書き込みデータを書き込む（ステップＳ１００３）。
【００５５】
ジャーナルログ制御部１１０は、ログエントリ種別がデータ追記書き込みログエントリであることを示す情報であるデータ追記書き込みログエントリ識別情報と、当該データ追記ログエントリの書き込みデータサイズとによりデータ追記書き込みログエントリを作成し、挿入ポインタの位置に、当該データ追記書き込みログエントリを追加する（ステップＳ１００４）。
【００５６】
最後に、ジャーナルログ制御部１１０は、挿入ポインタを、ステップＳ１００４で書き込んだ当該データ追記書き込みログエントリの次の位置に設定する（ステップＳ１００５）。
【００５７】
[第１の実施形態におけるログエントリ領域確保処理]
図１１は、第１の実施形態におけるログエントリ領域確保処理の動作の一例を示すフローチャートである。初めに、ジャーナルログ制御部１１０は、ジャーナルログの挿入ポインタの位置のログページに、追加すべきログエントリを保持するのに十分な領域が空いているならば、ログエントリ領域確保処理を終了する。そうでなければ、ステップＳ１１０２へ遷移する（ステップＳ１１０１）。ジャーナルログの挿入ポインタの位置のログページに、追加すべきログエントリを保持するのに十分な領域が空いていないとき、ジャーナルログ制御部１１０は、空き領域管理部１２０に空きページの割り当てを要求して、空きページを取得する（ステップＳ１１０２）。
【００５８】
次に、ジャーナルログ制御部１１０は、ステップＳ１１０２で取得した空きページのアドレスを、挿入ポインタの位置のログページの末尾に書き込み、当該空きページをジャーナルログの連結リストに結合する（ステップＳ１１０３）。また、ジャーナルログ制御部１１０は、挿入ポインタの位置に、ログページ終端ログエントリを追加する（ステップＳ１１０４）。
【００５９】
最後に、ジャーナルログ制御部１１０は、挿入ポインタを、ステップＳ１１０２で取得した空きページの先頭の位置に設定する（ステップＳ１１０５）。
【００６０】
[第１の実施形態におけるコミット処理]
図１２は、第１の実施形態におけるコミット処理の動作の一例を示すフローチャートである。ジャーナルログ制御部１１０は、ジャーナルログの終点ポインタを、挿入ポインタの位置に設定する（ステップＳ１２０１）。
【００６１】
[第１の実施形態におけるチェックポイント処理]
図１３は、第１の実施形態におけるチェックポイント処理の動作の一例を示すフローチャートである。初めに、ジャーナルログ制御部１１０は、終点ポインタの位置を保存する（以降、保存終点ポインタ）（ステップＳ１３０１）。
【００６２】
ジャーナルログ制御部１１０は、チェックポイント処理開始時にコミット済みの各ログエントリ、すなわち、始点ポインタと保存終点ポインタの間にある各ログエントリに対して、ステップＳ１３０３からステップＳ１３１５の処理を実行する。初めに、ジャーナルログ制御部１１０は、ジャーナルログ内の処理対象のログエントリを示すログエントリポインタを始点ポインタの位置に設定する（ステップＳ１３０２）。
【００６３】
ジャーナルログ制御部１１０は、ログエントリポインタが保存終点ポインタと同じ位置ならば、ステップＳ１３１６へ、そうでなければ、ステップＳ１３０４へ遷移する（ステップＳ１３０３）。
【００６４】
ログエントリポインタが保存終点ポインタと同じ位置でないとき、ログエントリポインタが示すログエントリのログエントリ種別がデータ書き込みログエントリならば、ジャーナルログ制御部１１０は、ステップＳ１３０５へ、そうでなければ、ステップＳ１３１４へ遷移する（ステップＳ１３０４）。
【００６５】
ログエントリポインタが示すログエントリのログエントリ種別がデータ書き込みログエントリのとき、ジャーナルログ制御部１１０は、当該データ書き込みログエントリを読み出し（ステップＳ１３０５）、次に、ログエントリポインタ更新処理を実行して、ログエントリポインタをジャーナルログ内の次のログエントリに進める（ステップＳ１３０６）。ログエントリポインタ更新処理については後述する。
【００６６】
次に、ジャーナルログ制御部１１０は、ログエントリポインタが示すログエントリのログエントリ種別がデータ追記書き込みログエントリならば、ステップＳ１３０８へ、そうでなければ、ステップＳ１３１１へ遷移する（ステップＳ１３０７）。
【００６７】
ログエントリポインタが示すログエントリのログエントリ種別がデータ追記書き込みログエントリのとき、ジャーナルログ制御部１１０は、当該データ追記書き込みログエントリを読み出し（ステップＳ１３０８）、次に、ログエントリポインタ更新処理を実行して、ログエントリポインタをジャーナルログ内の次のログエントリに進める（ステップＳ１３０９）。ログエントリポインタ更新処理については後述する。
【００６８】
ジャーナルログ制御部１１０は、ステップＳ１３０８で読み出した当該データ追記書き込みログエントリの書き込みサイズを、ステップＳ１３０５で読み出した当該データ書き込みログエントリの書き込みサイズに加算する（ステップＳ１３１０）。
【００６９】
ジャーナルログ制御部１１０は、遅延チェックポイントフラグが偽、または、当該データ書き込みログエントリのページ内オフセットの値と、当該データ書き込みログエントリの書き込みサイズの値との合計が、ページサイズと同じ値ならば、ステップＳ１３１２へ、そうでなければ、ステップＳ１３１３へ遷移する（ステップＳ１３１１）。
【００７０】
遅延チェックポイントフラグが偽、または、当該データ書き込みログエントリのページ内オフセットの値と、当該データ書き込みログエントリの書き込みサイズの値の合計が、ページサイズと同じ値のとき、ジャーナルログ制御部１１０は、データ書き込みログエントリのチェックポイント処理を実行する（ステップＳ１３１２）。データ書き込みログエントリのチェックポイント処理については後述する。
【００７１】
遅延チェックポイントフラグが偽でない、かつ、当該データ書き込みログエントリのページ内オフセットの値と、当該データ書き込みログエントリの書き込みサイズの値との合計が、ページサイズ未満のとき、ジャーナルログ制御部１１０は、データ書き込みログエントリの遅延チェックポイント処理を実行する（ステップＳ１３１３）。データ書き込みログエントリの遅延チェックポイント処理については後述する。
【００７２】
ログエントリポインタが示すログエントリのログエントリ種別がデータ書き込みログエントリでないとき、ジャーナルログ制御部１１０は、メタデータ更新ログエントリのチェックポイント処理を実行し（ステップＳ１３１４）、次に、ログエントリポインタ更新処理を実行し、ログエントリポインタをジャーナルログ内の次のログエントリに進める（ステップＳ１３１５）。前述のとおり、メタデータ更新ログエントリのチェックポイント処理の詳細については説明を省略する。第１の実施形態におけるチェックポイント処理の動作の一例では、ログエントリ種別は、データ書き込みログエントリと、データ追記書き込みログエントリと、メタデータ更新ログエントリとのいずれかであることを仮定している。その他のログエントリ種別が存在するときは、当該ログエントリ種別であることの判定と、当該ログエントリに対応したチェックポイント処理を実行する必要がある。
【００７３】
最後に、ログエントリポインタが保存終点ポインタと同じ位置のとき、ジャーナルログ制御部１１０は、始点ポインタ更新処理を実行する（ステップＳ１３１６）。始点ポインタ更新処理については後述する。
【００７４】
[第１の実施形態におけるデータ書き込みログエントリのチェックポイント処理]
データ書き込みログエントリのチェックポイント処理は、処理時間を最小にするために、チェックポイント処理に伴うデータの書き込み量や書き込み回数などに応じて処理が異なるようにしてもよい。
【００７５】
例えば、データ書き込みログエントリの書き込みデータサイズが所定の閾値未満ならば、当該データ書き込みログエントリの書き込みデータページに保持されている書き込みデータを、当該データ書き込みログエントリの反映先データページアドレス保持アドレスのメモリ位置に保持されている反映先データページアドレスで示されるデータページにおける、当該データ書き込みログエントリの書き込みデータページ内オフセットの位置に書き込む。
【００７６】
また、例えば、データ書き込みログエントリの書き込みデータサイズが所定の閾値以上ならば、当該データ書き込みログエントリの書き込みデータページにおいて、書き込みデータが保持されている範囲以外の領域へ、当該データ書き込みログエントリの反映先データページアドレス保持アドレスのメモリ位置に保持されている反映先データページアドレスで示されるデータページからデータを書き込む。さらに、当該データ書き込みログエントリの反映先データページアドレス保持アドレスのメモリ位置に、当該データ書き込みログエントリの書き込みデータページアドレスを書き込む。所定の閾値としては、例えば、ページサイズの１／２とする。
【００７７】
図１４は、第１の実施形態におけるデータ書き込みログエントリのチェックポイント処理の動作の一例を示すフローチャートである。初めに、ジャーナルログ制御部１１０は、データ書き込みログエントリの反映先データページアドレス保持アドレスのメモリ位置に保持されている反映先データページアドレスがヌル、すなわち、当該反映先データページが存在しないならば、ステップＳ１４１１へ、そうでなければ、ステップＳ１４０２へ遷移する（ステップＳ１４０１）。
【００７８】
反映先データページアドレスがヌルでないとき、ジャーナルログ制御部１１０は、当該データ書き込みログエントリの書き込みデータサイズが所定の閾値未満ならば、ステップＳ１４０３へ、そうでなければ、ステップＳ１４０４へ遷移する（ステップＳ１４０２）。
【００７９】
当該データ書き込みログエントリの書き込みデータサイズが所定の閾値未満のとき、ジャーナルログ制御部１１０は、当該データ書き込みログエントリの書き込みデータページアドレスで示される書き込みデータページに保持されている書き込みデータを、当該データ書き込みログエントリの反映先データページアドレス保持アドレスのメモリ位置に保持されている反映先データページアドレスで示される反映先データページにおける当該データ書き込みログエントリの書き込みデータページ内オフセットの位置へ、当該データ書き込みログエントリの書き込みデータサイズ分、書き込む（ステップＳ１４０３）。
【００８０】
当該データ書き込みログエントリの書き込みデータサイズが所定の閾値未満でないとき、ジャーナルログ制御部１１０は、当該データ書き込みログエントリの書き込みデータページ内オフセットが０でないならば、ステップＳ１４０５へ、そうでなければ、ステップＳ１４０６へ遷移する（ステップＳ１４０４）。
【００８１】
当該データ書き込みログエントリの書き込みデータページ内オフセットが０でないとき、ジャーナルログ制御部１１０は、当該データ書き込みログエントリの反映先データページアドレス保持アドレスのメモリ位置に保持されている反映先データページアドレスで示される反映先データページの先頭から、当該データ書き込みログエントリの書き込みデータページアドレスで示される書き込みデータページの先頭へ、当該データ書き込みログエントリの書き込みデータページ内オフセットの値のサイズ分、データを書き込む（ステップＳ１４０５）。
【００８２】
ジャーナルログ制御部１１０は、当該データ書き込みログエントリの書き込みデータページ内オフセットと、当該データ書き込みログエントリの書き込みデータサイズとを加算した値が、ページサイズよりも小さいならば、ステップＳ１４０７へ、そうでなければ、ステップＳ１４０８へ遷移する（ステップＳ１４０６）。
【００８３】
当該データ書き込みログエントリの書き込みデータページ内オフセットと、当該データ書き込みログエントリの書き込みデータサイズとを加算した値が、ページサイズよりも小さいとき、ジャーナルログ制御部１１０は、当該データ書き込みログエントリの反映先データページアドレス保持アドレスのメモリ位置に保持されている反映先データページアドレスで示される反映先データページにおいて、当該データ書き込みログエントリの書き込みデータページ内オフセットと、当該データ書き込みログエントリの書き込みデータサイズとを加算した値の位置から、当該反映先データページの末尾までのデータを、当該データ書き込みログエントリの書き込みデータページアドレスで示される書き込みデータページにおいて、当該データ書き込みログエントリの書き込みデータページ内オフセットと、当該データ書き込みログエントリの書き込みデータサイズとを加算した値の位置へ書き込む（ステップＳ１４０７）。
【００８４】
ジャーナルログ制御部１１０は、当該データ書き込みログエントリの反映先データページアドレス保持アドレスのメモリ位置に保持されている反映先データページアドレスを保存する（ステップＳ１４０８）。
【００８５】
ジャーナルログ制御部１１０は、当該データ書き込みログエントリの反映先データページアドレス保持アドレスのメモリ位置に、当該データ書き込みログエントリの書き込みデータページアドレスを書き込む（ステップＳ１４０９）。
【００８６】
ジャーナルログ制御部１１０は、空き領域管理部１２０に、ステップＳ１４０８で保存した当該反映先データページアドレスで示される反映先データページの解放を要求して、当該反映先データページを解放する（ステップＳ１４１０）。
【００８７】
当該データ書き込みログエントリの反映先データページアドレス保持アドレスのメモリ位置に保持されている反映先データページアドレスがヌル、すなわち、当該反映先データページが存在しないとき、ジャーナルログ制御部１１０は、当該データ書き込みログエントリの書き込みデータページ内オフセットが０でないならば、ステップＳ１４１２へ、そうでなければ、ステップＳ１４１３へ遷移する（ステップＳ１４１１）。
【００８８】
当該データ書き込みログエントリの書き込みデータページ内オフセットが０でないとき、ジャーナルログ制御部１１０は、当該データ書き込みログエントリの書き込みデータページアドレスで示される書き込みデータページにおいて、当該書き込みデータページの先頭から、当該データ書き込みログエントリの書き込みデータページ内オフセットの値のサイズ分、０を書き込む（ステップＳ１４１２）。
【００８９】
ジャーナルログ制御部１１０は、当該データ書き込みログエントリの書き込みデータページ内オフセットと、当該データ書き込みログエントリの書き込みデータサイズとを加算した値が、ページサイズよりも小さいならば、ステップＳ１４１４へ、そうでなければ、ステップＳ１４１５へ遷移する（ステップＳ１４１３）。
【００９０】
当該データ書き込みログエントリの書き込みデータページ内オフセットと、当該データ書き込みログエントリの書き込みデータサイズとを加算した値が、ページサイズよりも小さいとき、ジャーナルログ制御部１１０は、当該データ書き込みログエントリの書き込みデータページアドレスで示される書き込みデータページにおいて、当該データ書き込みログエントリの書き込みデータページ内オフセットと、当該データ書き込みログエントリの書き込みデータサイズとを加算した値の位置から、当該書き込みデータページの末尾まで、０を書き込む（ステップＳ１４１４）。
【００９１】
ジャーナルログ制御部１１０は、当該データ書き込みログエントリの反映先データページアドレス保持アドレスのメモリ位置に、当該データ書き込みログエントリの書き込みデータページアドレスを書き込む（ステップＳ１４１５）。
【００９２】
[第１の実施形態におけるログエントリポインタ更新処理]
図１５は、第１の実施形態におけるログエントリポインタ更新処理の動作の一例を示すフローチャートである。初めに、ジャーナルログ制御部１１０は、ログエントリポインタの示すログエントリのログエントリ種別に応じたログエントリのサイズ分、当該ログエントリポインタに加算する（ステップＳ１５０１）。
【００９３】
ジャーナルログ制御部１１０は、当該ログエントリポインタの示すログエントリのエントリ種別が、ログページ終端ログエントリならば、ステップＳ１５０３へ遷移する。そうでなければ、ジャーナルログ制御部１１０は、当該ログエントリポインタ更新処理を終了する（ステップＳ１５０２）。
【００９４】
当該ログエントリポインタの示すログエントリのエントリ種別が、ログページ終端ログエントリのとき、ジャーナルログ制御部１１０は、当該ログエントリポインタを、当該ログエントリポインタの位置のログページの末尾に保持されている、ジャーナルログの連結リスト内の次のログページの先頭に設定する（ステップＳ１５０３）。
【００９５】
[第１の実施形態におけるデータ書き込みログエントリの遅延チェックポイント処理]
図１６は、第１の実施形態におけるデータ書き込みログエントリの遅延チェックポイント処理の動作の一例を示すフローチャートである。初めに、ジャーナルログ制御部１１０は、ログエントリ領域確保処理を実行し、ジャーナルログ内に、データ書き込みログエントリを書き込むための空き領域を確保する（ステップＳ１６０１）。
【００９６】
ジャーナルログ制御部１１０は、挿入ポインタの位置に、図１３のステップＳ１３０５で読み出し、さらに、図１３のステップＳ１３０７の条件が真のときに、図１３のステップＳ１３１０で書き込みサイズを加算した、当該データ書き込みログエントリを追加する（ステップＳ１６０２）。ジャーナルログ制御部１１０は、挿入ポインタを、ステップＳ１６０２で追加したデータ書き込みログエントリの次の位置に設定する（ステップＳ１６０３）。最後に、ジャーナルログ制御部１１０は、コミット処理を実行する（ステップＳ１６０４）。
【００９７】
[第１の実施形態における始点ポインタ更新処理]
図１７は、第１の実施形態における始点ポインタ更新処理の動作の一例を示すフローチャートである。初めに、ジャーナルログ制御部１１０は、ジャーナルログ内の処理対象のログエントリを示すログエントリポインタを、始点ポインタの位置に設定する（ステップＳ１７０１）。
【００９８】
次に、ジャーナルログ制御部１１０は、ジャーナルログ内の処理対象のログページを示すログページポインタを、始点ポインタの位置のログページに設定する（ステップＳ１７０２）。
【００９９】
ジャーナルログ制御部１１０は、ログエントリポインタが図１３のステップＳ１３０１で保存した保存終点ポインタと同じ位置ならば、ステップＳ１７１０へ、そうでなければ、ステップＳ１７０４へ遷移する（ステップＳ１７０３）。
【０１００】
ログエントリポインタが保存終点ポインタと同じ位置でないとき、ジャーナルログ制御部１１０は、ログエントリポインタが示すログエントリのログエントリ種別がデータ書き込みログエントリであり、かつ、当該データ書き込みログエントリのチェックポイント処理で図１４のステップＳ１４０３を実行しているならば、ステップＳ１７０５へ、そうでなければ、ステップＳ１７０６へ遷移する（ステップＳ１７０４）。
【０１０１】
ログエントリポインタが示すログエントリのログエントリ種別がデータ書き込みログエントリであり、かつ、当該データ書き込みログエントリのチェックポイント処理で図１４のステップ１４０３を実行しているとき、ジャーナルログ制御部１１０は、空き領域管理部１２０に、データ書き込みログエントリの書き込みデータページアドレスで示される書き込みデータページの解放を要求して、当該書き込みデータページを解放する（ステップＳ１７０５）。
【０１０２】
ジャーナルログ制御部１１０は、ログエントリポインタ更新処理を実行し、ログエントリポインタをジャーナルログ内の次のログエントリに進める（ステップＳ１７０６）。ジャーナルログ制御部１１０は、ステップＳ１７０６で、ジャーナルログの連結リスト内の次のログページに進んでいるならば、ステップＳ１７０８へ、そうでなければ、ステップＳ１７０３へ遷移する（ステップＳ１７０７）。
【０１０３】
ジャーナルログの連結リスト内の次のログページに進んでいるとき、ジャーナルログ制御部１１０は、空き領域管理部１２０に、ログページポインタが示すログページの解放を要求して、当該ログページを解放する（ステップＳ１７０８）。ジャーナルログ制御部１１０は、ログページポインタをログエントリポインタの位置のログページに設定する（ステップＳ１７０９）。
【０１０４】
最後に、ログエントリポインタが保存終点ポインタと同じ位置のとき、ジャーナルログ制御部１１０は、始点ポインタを保存終点ポインタの位置に設定する（ステップＳ１７１０）。
【０１０５】
[第１の実施形態の効果]
第１の実施形態において、永続メモリ２００は、データと、メタデータと、データとメタデータの更新履歴であるジャーナルログと、を格納する。また、ジャーナルログ制御部１１０は、書き込み要求があった場合に、書き込み要求に伴うデータとメタデータの更新履歴をジャーナルログに格納するジャーナリング処理と、ジャーナルログに格納された更新履歴を確定させるコミット処理と、ジャーナルログに格納された確定した更新履歴をデータやメタデータに反映させるチェックポイント処理と、チェックポイント処理を遅延させる遅延チェックポイント処理と、の実行を制御する。
【０１０６】
例えば、第１の実施形態によれば、チェックポイント処理において、書き込みデータがデータ書き込みログエントリの書き込みデータページの末尾に到達していないときは、当該データ書き込みログエントリの書き込みを、書き込みデータが書き込みデータページの末尾に到達するまで遅延させることができる。このため、第１の実施形態によれば、ジャーナリングにおけるチェックポイント処理を、書き込みデータページごとにまとめて行うことができるため、ジャーナリングを用いて、障害発生時におけるファイルシステムのデータとメタデータの双方の整合性を確保するとともに、ジャーナリングに伴う書き込み量を削減することにより、ファイルシステムの書き込み性能を向上させることができる。
【０１０７】
また、ジャーナルログ制御部１１０は、チェックポイント処理を遅延させているジャーナルログ内のログエントリにおける書き込みデータのサイズが所定の閾値未満である場合には、ジャーナルログ内のログエントリにおける書き込みデータをファイルに反映させ、所定の閾値以上である場合には、ジャーナルログ内のログエントリにおける書き込みデータを格納しているページを、ファイルのデータを格納するページとして用いる。これにより、ジャーナルログからファイルへの書き込み回数を削減することができる。
【符号の説明】
【０１０８】
１０  システム
１００  ファイルシステム
１１０  ジャーナルログ制御部
１２０  空き領域管理部
２００  永続メモリ
３００  ジャーナルログ
３１０、３２０、３３０  ログページ
３１１、３１２、３１３、３２１、３２２、３２３、３２４、３２５、３３１  ログエントリ
３４０  始点ポインタ
３５０  終点ポインタ
３６０  挿入ポインタ
４００  ログエントリ
４１０  ヘッダ部
４２０  データ部
５００  データ書き込みログエントリ
５１０  ヘッダ部
５１１  データ書き込みログエントリ識別情報
５２０  データ部
５２１  書き込みデータページ
５２２  書き込みデータページアドレス
５２３  ファイル内オフセット
５２４  書き込みデータページ内オフセット
５２５  書き込みデータサイズ
５２６  反映先データページアドレス保持アドレス
６００  データ追記書き込みログエントリ
６１０  ヘッダ部
６１１  データ追記書き込みログエントリ識別情報
６２０  データ部
６２１  追記書き込みデータサイズ
７００  ログページ終端ログエントリ
７１０  ヘッダ部
７１１  ログページ終端ログエントリ識別情報
【図１】
2019003288.tif 000003
【図２】
2019003288.tif 000004
【図３】
2019003288.tif 000005
【図４】
2019003288.tif 000006
【図５】
2019003288.tif 000007
【図６】
2019003288.tif 000008
【図７】
2019003288.tif 000009
【図８】
2019003288.tif 000010
【図９】
2019003288.tif 000011
【図１０】
2019003288.tif 000012
【図１１】
2019003288.tif 000013
【図１２】
2019003288.tif 000014
【図１３】
2019003288.tif 000015
【図１４】
2019003288.tif 000016
【図１５】
2019003288.tif 000017
【図１６】
2019003288.tif 000018
【図１７】
2019003288.tif 000019