From 37c48e89aa3f15e81ee746009b948e46fef7cdfe Mon Sep 17 00:00:00 2001 From: Johnathan Sharratt Date: Sat, 22 Jun 2024 18:21:48 +1000 Subject: [PATCH 1/5] Added another journal transaction point used for durability --- lib/journal/src/concrete/archived.rs | 1 + lib/journal/src/concrete/archived_from.rs | 3 +++ lib/journal/src/snapshot.rs | 3 +++ lib/wasix/src/os/task/process.rs | 13 +++++++++++++ 4 files changed, 20 insertions(+) diff --git a/lib/journal/src/concrete/archived.rs b/lib/journal/src/concrete/archived.rs index 19687e273fd..64d0ad2ce6b 100644 --- a/lib/journal/src/concrete/archived.rs +++ b/lib/journal/src/concrete/archived.rs @@ -1578,6 +1578,7 @@ pub enum JournalSnapshotTriggerV1 { Sigstop, NonDeterministicCall, Bootstrap, + Transaction, } #[repr(C)] diff --git a/lib/journal/src/concrete/archived_from.rs b/lib/journal/src/concrete/archived_from.rs index 5ce521a7f74..e86e5c5719b 100644 --- a/lib/journal/src/concrete/archived_from.rs +++ b/lib/journal/src/concrete/archived_from.rs @@ -184,6 +184,7 @@ impl From for JournalSnapshotTriggerV1 { SnapshotTrigger::Sigstop => JournalSnapshotTriggerV1::Sigstop, SnapshotTrigger::NonDeterministicCall => JournalSnapshotTriggerV1::NonDeterministicCall, SnapshotTrigger::Bootstrap => JournalSnapshotTriggerV1::Bootstrap, + SnapshotTrigger::Transaction => JournalSnapshotTriggerV1::Transaction, } } } @@ -202,6 +203,7 @@ impl From for SnapshotTrigger { JournalSnapshotTriggerV1::Sigstop => SnapshotTrigger::Sigstop, JournalSnapshotTriggerV1::NonDeterministicCall => SnapshotTrigger::NonDeterministicCall, JournalSnapshotTriggerV1::Bootstrap => SnapshotTrigger::Bootstrap, + JournalSnapshotTriggerV1::Transaction => SnapshotTrigger::Transaction, } } } @@ -222,6 +224,7 @@ impl From<&'_ ArchivedJournalSnapshotTriggerV1> for SnapshotTrigger { SnapshotTrigger::NonDeterministicCall } ArchivedJournalSnapshotTriggerV1::Bootstrap => SnapshotTrigger::Bootstrap, + ArchivedJournalSnapshotTriggerV1::Transaction => SnapshotTrigger::Transaction, } } } diff --git a/lib/journal/src/snapshot.rs b/lib/journal/src/snapshot.rs index 380b810557f..787101db3bb 100644 --- a/lib/journal/src/snapshot.rs +++ b/lib/journal/src/snapshot.rs @@ -28,6 +28,8 @@ pub enum SnapshotTrigger { NonDeterministicCall, /// Bootstrapping process Bootstrap, + /// Transaction + Transaction, } impl SnapshotTrigger { @@ -64,6 +66,7 @@ impl FromStr for SnapshotTrigger { "stop" | "sigstop" => Self::Sigstop, "non-deterministic-call" => Self::NonDeterministicCall, "bootstrap" => Self::Bootstrap, + "transaction" => Self::Transaction, a => return Err(anyhow::format_err!("invalid or unknown trigger ({a})")), }) } diff --git a/lib/wasix/src/os/task/process.rs b/lib/wasix/src/os/task/process.rs index 844dfd6f4a7..0a408ad511b 100644 --- a/lib/wasix/src/os/task/process.rs +++ b/lib/wasix/src/os/task/process.rs @@ -595,6 +595,19 @@ impl WasiProcess { self.wait_for_checkpoint_finish() } + /// Takes a snapshot of the process + /// + /// Note: If you ignore the returned future the checkpoint will still + /// occur but it will execute asynchronously + pub fn snapshot( + &self, + trigger: SnapshotTrigger, + ) -> std::pin::Pin + Send + Sync>> { + let mut guard = self.inner.0.lock().unwrap(); + guard.checkpoint = WasiProcessCheckpoint::Snapshot { trigger }; + self.wait_for_checkpoint_finish() + } + /// Disables the journaling functionality pub fn disable_journaling_after_checkpoint(&self) { let mut guard = self.inner.0.lock().unwrap(); From 987486f5dafbfac157e1544518e767334b957890 Mon Sep 17 00:00:00 2001 From: Johnathan Sharratt Date: Sat, 22 Jun 2024 19:05:02 +1000 Subject: [PATCH 2/5] Added another method for opening a journal in readonly mode --- lib/journal/src/concrete/log_file.rs | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/lib/journal/src/concrete/log_file.rs b/lib/journal/src/concrete/log_file.rs index 5c17d500a17..2277fc23370 100644 --- a/lib/journal/src/concrete/log_file.rs +++ b/lib/journal/src/concrete/log_file.rs @@ -105,6 +105,13 @@ impl LogFileJournal { Self::from_file(file) } + pub fn new_readonly(path: impl AsRef) -> anyhow::Result { + let file = std::fs::File::options() + .read(true) + .open(path)?; + Self::from_file(file) + } + pub fn owned_buffer(&self) -> OwnedBuffer { self.rx.owned_buffer() } From b3b8a21c360a9b3bb378d72feb666bf2eb083b10 Mon Sep 17 00:00:00 2001 From: Johnathan Sharratt Date: Sat, 22 Jun 2024 19:23:55 +1000 Subject: [PATCH 3/5] Linting fix --- lib/journal/src/concrete/log_file.rs | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/lib/journal/src/concrete/log_file.rs b/lib/journal/src/concrete/log_file.rs index 2277fc23370..be3a876d71c 100644 --- a/lib/journal/src/concrete/log_file.rs +++ b/lib/journal/src/concrete/log_file.rs @@ -106,9 +106,7 @@ impl LogFileJournal { } pub fn new_readonly(path: impl AsRef) -> anyhow::Result { - let file = std::fs::File::options() - .read(true) - .open(path)?; + let file = std::fs::File::options().read(true).open(path)?; Self::from_file(file) } From 56e3b22ecf10271f8846510b5a9fad0516f98e58 Mon Sep 17 00:00:00 2001 From: Johnathan Sharratt Date: Wed, 26 Jun 2024 22:58:52 +1000 Subject: [PATCH 4/5] Fixed a bug where the thread state was incorrect for last transaction --- lib/journal/src/concrete/compacting.rs | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/lib/journal/src/concrete/compacting.rs b/lib/journal/src/concrete/compacting.rs index 8f64eb9b017..4c858841e43 100644 --- a/lib/journal/src/concrete/compacting.rs +++ b/lib/journal/src/concrete/compacting.rs @@ -60,6 +60,9 @@ struct State { // Thread events are only maintained while the thread and the // process are still running thread_map: HashMap, + // Thread events are only maintained while the thread and the + // process are still running + staged_thread_map: HashMap, // Sockets that are open and not yet closed are kept here open_sockets: HashMap, // Open pipes have two file descriptors that are associated with @@ -226,6 +229,7 @@ impl CompactingJournal { snapshots: Default::default(), memory_map: Default::default(), thread_map: Default::default(), + staged_thread_map: Default::default(), open_sockets: Default::default(), open_pipes: Default::default(), create_directory: Default::default(), @@ -364,12 +368,13 @@ impl WritableJournal for CompactingJournalTx { state.memory_map.insert(region.clone().into(), event_index); } JournalEntry::SetThreadV1 { id, .. } => { - state.thread_map.insert(*id, event_index); + state.staged_thread_map.insert(*id, event_index); } JournalEntry::CloseThreadV1 { id, .. } => { - state.thread_map.remove(id); + state.staged_thread_map.remove(id); } JournalEntry::SnapshotV1 { .. } => { + state.thread_map = state.staged_thread_map.clone(); state.snapshots.push(event_index); } JournalEntry::ProcessExitV1 { .. } => { From 8a5e1540f513bc92f0cdbc5cab7d9de151e110ce Mon Sep 17 00:00:00 2001 From: Johnathan Sharratt Date: Wed, 3 Jul 2024 19:40:25 +1000 Subject: [PATCH 5/5] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 97699766ba0..c244ca9101c 100644 --- a/README.md +++ b/README.md @@ -22,7 +22,7 @@

-
+
Wasmer is a _blazing fast_ and _secure_ [**WebAssembly**](https://webassembly.org) runtime that enables incredibly _lightweight containers_ to run anywhere: from _Desktop_ to the _Cloud_, _Edge_ and your browser.