cannyls
cannyls copied to clipboard
異常終了時にジャーナル領域からEndOfRecordsが消失し、再起不能になる
問題
CannyLS v.0.9.3以前では、何らかの異常によりCannyLSを用いるプロセスが正常終了しなかった場合に、ジャーナル領域の末尾を表すための特殊なレコード EndOfRecords がジャーナル領域から消失してしまう。特にこの状況の発生したlusfファイルについては、Open時に以下のエラーが発生し、以降そのlusfファイルを用いることができない:
Error(TrackableError {
kind: StorageCorrupted,
cause: Some(Cause(StringError("assertion failed: `!self.is_second_lap`"))),
history: History([
Location { module_path: "cannyls::storage::journal::ring_buffer", file: "/home/yuezato/.cargo/git/checkouts/cannyls-6d66531919646a3c/8759940/src/storage/journal/ring_buffer.rs", line: 327, message: "" },
Location { module_path: "cannyls::storage::journal::region", file: "/home/yuezato/.cargo/git/checkouts/cannyls-6d66531919646a3c/8759940/src/storage/journal/region.rs", line: 334, message: "" },
Location { module_path: "cannyls::storage::journal::region", file: "/home/yuezato/.cargo/git/checkouts/cannyls-6d66531919646a3c/8759940/src/storage/journal/region.rs", line: 96, message: "" },
Location { module_path: "cannyls::storage::builder", file: "/home/yuezato/.cargo/git/checkouts/cannyls-6d66531919646a3c/8759940/src/storage/builder.rs", line: 189, message: "" },
Location { module_path: "cannyls::storage", file: "/home/yuezato/.cargo/git/checkouts/cannyls-6d66531919646a3c/8759940/src/storage/mod.rs", line: 114, message: "" },
Location { module_path: "miss_eor", file: "src/main.rs", line: 23, message: "" }]) })
問題の起こる原因
図式的なものであるが、cannylsは次のようにジャーナル領域に対して追記を行う:
...[record_1][record_2][eor] <== [record_3]の追加
↓
...[record_1][record_2][record_3][eor]
古いeorレコードが新しいレコードrecord_3で上書きされることに注意。
以上は正常な計算の流れであるが、例えばrecord_3で上書きしている途中でcrashすると
...[record_1][record_2][eor] <== [record_3]の追加(途中でcrash)
↓
...[record_1][record_2][record'_3]
という状況になり、eorレコードが欠けたジャーナル領域が出来てしまう。
record_3に該当するフィールドが巨大であればあるほど、途中でcrashした場合にeorレコードが欠けてしまう可能性が高まる。
実際、record_3と上で書いたものは、ジャーナル領域に対するバッファと読み替えることができ、この場合には巨大な書き込みが発生しうる。
対策
全ての操作についてジャーナルのディスク同期を行うことが考えられる。一部でもsyncを行わない場合は依然として問題が発生することになるため、全ての操作についてsyncが必要になる。
一方で、これは甚大なパフォーマンス低下を引き起こすことになるため、より良い対応が必須となる。
再現
手早く再現を行うために次のリポジトリを用いる: https://github.com/yuezato/cannyls_eor_vanish
確認できている問題の発生する環境
- Mac OSX 10.13.6 on SSD,
- Ubuntu 16.04 (Kernel version 4.4.0) on SSD, HDD
- Ubuntu 18.10 (Kernel version 4.18.0) on SSD, HDD