diff --git a/README.md b/README.md index ed501466d25..fe42233abe1 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. 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/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 { .. } => { diff --git a/lib/journal/src/concrete/log_file.rs b/lib/journal/src/concrete/log_file.rs index 5c17d500a17..be3a876d71c 100644 --- a/lib/journal/src/concrete/log_file.rs +++ b/lib/journal/src/concrete/log_file.rs @@ -105,6 +105,11 @@ 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() } 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();