harmos_storage/
file_capture.rs1use crate::{FileReference, Result, StorageManager};
24use harmos_domain::model::storage::files::CaptureConsistency;
25use harmos_domain::operations::storage::{CaptureFile, ReadFile};
26
27impl<C> StorageManager<C> {
42 pub async fn capture_file(&self, request: CaptureFile) -> Result<FileReference> {
43 let context = crate::execution::Context::current();
44 let span = context.sync(|| tracing::debug_span!("storage.file.capture_file", outcome = "cancelled"));
45 context
46 .result(span, async {
47 let mut reader = self.read_file(ReadFile { source: request.source, range: request.range }).await?;
48 let mut target = self.create_file(request.metadata).await?;
49 while let Some((batch, memory)) = reader.next_raw(false).await? {
50 target.write_all(batch.bytes).await?;
51 drop(memory);
52 }
53 reader.completion()?;
54 if request.consistency == CaptureConsistency::Stable {
55 reader.check_unchanged().await?;
56 }
57 let reference = target.finish().await?;
58 self.flush_until(&reference.position).await?;
59 Ok(reference)
60 })
61 .await
62 }
63}
64
65