wasmer_wasix/syscalls/journal/actions/
snapshot.rs

1use 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        // If we are not in the same module then we fire off an exit
12        // that simulates closing the process (hence keeps everything
13        // in a clean state)
14        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        // Execute all the ethereal events
30        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}