Skip to main content

harmos_storage/
file_capture.rs

1/* ***
2 *
3 * Harmos
4 *
5 * SPDX-License-Identifier: Apache-2.0
6 *
7 * ***
8 */
9
10// Capture A File Range Into Independent Immutable Durable Storage.
11
12/* === Modules === */
13
14/* === Re-Exports === */
15
16/* === Imports === */
17
18// Standard Library Imports
19
20// Third Party Imports
21
22// Local Imports
23use crate::{FileReference, Result, StorageManager};
24use harmos_domain::model::storage::files::CaptureConsistency;
25use harmos_domain::operations::storage::{CaptureFile, ReadFile};
26
27/* === Constants === */
28
29/* === Macros === */
30
31/* === Type Aliases === */
32
33/* === Structs === */
34
35/* === Enums === */
36
37/* === Traits === */
38
39/* === Implementations === */
40
41impl<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/* === Public Functions === */
66
67/* === Private Functions === */
68
69/* === Tests === */