Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

異常終了時にジャーナル領域からEndOfRecordsが消失し、再起不能になる #27

Open
yuezato opened this issue Apr 9, 2019 · 0 comments
Assignees

Comments

@yuezato
Copy link
Member

yuezato commented Apr 9, 2019

問題

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
@yuezato yuezato self-assigned this Apr 9, 2019
@yuezato yuezato changed the title CannyLSの異常終了時にジャーナル領域からEndOfRecordsが消える CannyLSの異常終了時にジャーナル領域からEndOfRecordsが消失し、再起不能になる Apr 9, 2019
@yuezato yuezato changed the title CannyLSの異常終了時にジャーナル領域からEndOfRecordsが消失し、再起不能になる 異常終了時にジャーナル領域からEndOfRecordsが消失し、再起不能になる Apr 9, 2019
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant