We read every piece of feedback, and take your input very seriously.
To see all available qualifiers, see our documentation.
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
CannyLS v.0.9.3以前では、何らかの異常によりCannyLSを用いるプロセスが正常終了しなかった場合に、ジャーナル領域の末尾を表すための特殊なレコード EndOfRecords がジャーナル領域から消失してしまう。特にこの状況の発生したlusfファイルについては、Open時に以下のエラーが発生し、以降そのlusfファイルを用いることができない:
EndOfRecords
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すると
eor
record_3
...[record_1][record_2][eor] <== [record_3]の追加(途中でcrash) ↓ ...[record_1][record_2][record'_3]
という状況になり、eorレコードが欠けたジャーナル領域が出来てしまう。
record_3に該当するフィールドが巨大であればあるほど、途中でcrashした場合にeorレコードが欠けてしまう可能性が高まる。 実際、record_3と上で書いたものは、ジャーナル領域に対するバッファと読み替えることができ、この場合には巨大な書き込みが発生しうる。
全ての操作についてジャーナルのディスク同期を行うことが考えられる。一部でもsyncを行わない場合は依然として問題が発生することになるため、全ての操作についてsyncが必要になる。 一方で、これは甚大なパフォーマンス低下を引き起こすことになるため、より良い対応が必須となる。
sync
手早く再現を行うために次のリポジトリを用いる: https://github.com/yuezato/cannyls_eor_vanish
The text was updated successfully, but these errors were encountered:
yuezato
No branches or pull requests
問題
CannyLS v.0.9.3以前では、何らかの異常によりCannyLSを用いるプロセスが正常終了しなかった場合に、ジャーナル領域の末尾を表すための特殊なレコード
EndOfRecords
がジャーナル領域から消失してしまう。特にこの状況の発生したlusfファイルについては、Open時に以下のエラーが発生し、以降そのlusfファイルを用いることができない:問題の起こる原因
図式的なものであるが、cannylsは次のようにジャーナル領域に対して追記を行う:
古い
eor
レコードが新しいレコードrecord_3
で上書きされることに注意。以上は正常な計算の流れであるが、例えば
record_3
で上書きしている途中でcrashするとという状況になり、
eor
レコードが欠けたジャーナル領域が出来てしまう。record_3
に該当するフィールドが巨大であればあるほど、途中でcrashした場合にeor
レコードが欠けてしまう可能性が高まる。実際、
record_3
と上で書いたものは、ジャーナル領域に対するバッファと読み替えることができ、この場合には巨大な書き込みが発生しうる。対策
全ての操作についてジャーナルのディスク同期を行うことが考えられる。一部でもsyncを行わない場合は依然として問題が発生することになるため、全ての操作について
sync
が必要になる。一方で、これは甚大なパフォーマンス低下を引き起こすことになるため、より良い対応が必須となる。
再現
手早く再現を行うために次のリポジトリを用いる:
https://github.com/yuezato/cannyls_eor_vanish
確認できている問題の発生する環境
The text was updated successfully, but these errors were encountered: