書き込み中に電源障害が発生した場合でも、ファイルにアトミックに追加する手段を提供するクラスをC++で書き込もうとしています。
まず、現在のファイル位置(ファイルの先頭から64オフセット、バイト単位)を別のジャーナルファイルに書き込みます。次に、要求されたデータを日付ファイルの最後に書き込みます。最後に、ジャーナルファイルでftruncate()を呼び出します(切り捨てられたサイズを0に設定します)。
主なアイデアは、このクラスが空でないジャーナルファイルを含むファイルを開くように要求された場合、書き込みが中断されたことを認識し、ジャーナルファイルから最後の書き込みの位置を読み取ってその場所にfseekできるということです。最後の部分的な書き込みは失われますが、ファイルが破損してはなりません。
残念ながら、ftruncate()は非同期のようです。実際には、ftruncateの後にfflush()とfsync()を呼び出しても、大量の書き込みを行っている間、ジャーナルが最大数百バイトに成長するのがわかります。最終的には常に0になりますが、常にサイズ0またはサイズ8のいずれかで表示されると予想していました。
ftruncateを完全に同期させることは可能ですか?それとも、ジャーナルを使用するためのより良い方法はありますか?