wasmer_wasix/syscalls/journal/actions/
snapshot.rs1use super::*;
2
3impl<'a> JournalSyscallPlayer<'a, '_> {
4 #[allow(clippy::result_large_err)]
5 pub(crate) unsafe fn action_snapshot(
6 &mut self,
7 when: SystemTime,
8 trigger: SnapshotTrigger,
9 differ_ethereal: Option<&mut Vec<JournalEntry<'a>>>,
10 ) -> Result<(), WasiRuntimeError> {
11 let mut clear_ethereal = false;
15 if self.journal_module_hash.is_some()
16 && Some(&self.cur_module_hash) != self.journal_module_hash.as_ref()
17 {
18 tracing::error!(
19 "The WASM module hash does not match the journal module hash (journal_hash={:x?} vs module_hash{:x?}) - forcing a restart",
20 self.journal_module_hash.as_ref().unwrap(),
21 self.cur_module_hash
22 );
23 self.clear_ethereal(differ_ethereal);
24 return Ok(());
25 }
26
27 tracing::trace!("Replay journal - Snapshot (trigger={:?})", trigger);
28
29 if let Some(ethereal_events) = differ_ethereal {
31 for next in ethereal_events.drain(..) {
32 tracing::trace!("Replay(ether) snapshot event - {next:?}");
33 if let Err(err) = unsafe { self.play_event(next, None) } {
34 tracing::warn!("failed to replay event - {}", err);
35 return Err(err);
36 }
37 }
38 for (region, data) in self.staged_differ_memory.drain(..) {
39 tracing::trace!(
40 "Differ(end) memory event - {region:?} data.len={}",
41 data.len()
42 );
43 self.differ_memory.push((region, data));
44 }
45 }
46
47 self.ctx.data_mut().pop_snapshot_trigger(trigger);
48 Ok(())
49 }
50}