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();