harmos_domain/model/storage/
writes.rs1use super::{ArrowIpc, SchemaKey, StorageCursor};
22use crate::{Identifier, MemorySize};
23
24crate::model::storage::codec::product!(DataBatch {
29 sequence: crate::model::storage::codec::Unsigned => 1,
30 destination: crate::model::storage::codec::Id => 2,
31 schema: crate::model::storage::codec::Nested<SchemaKey> => 3,
32 data: crate::model::storage::codec::Nested<ArrowIpc> => 4,
33});
34crate::model::storage::codec::product!(BatchReceipt {
35 sequence: crate::model::storage::codec::Unsigned => 1,
36 cursor: crate::model::storage::codec::Nested<StorageCursor> => 2,
37});
38crate::model::storage::codec::product!(WriteCompletion {
39 batches: crate::model::storage::codec::Unsigned => 1,
40 cursor: crate::model::storage::codec::Nested<StorageCursor> => 2,
41});
42crate::model::storage::codec::variants!(WriteReceipt {
43 0, 1, "accepted": Self::Accepted(receipt) => {
44 receipt: crate::model::storage::codec::Nested<BatchReceipt> => 1,
45 } => Self::Accepted(receipt);
46 1, 2, "durable": Self::Durable(receipt) => {
47 receipt: crate::model::storage::codec::Nested<BatchReceipt> => 1,
48 } => Self::Durable(receipt);
49});
50
51#[derive(Clone, Debug)]
56pub struct DataBatch {
57 pub sequence: u64,
58 pub destination: Identifier,
59 pub schema: SchemaKey,
60 pub data: ArrowIpc,
61}
62
63#[derive(Clone, Debug, PartialEq, Eq)]
64pub struct BatchReceipt {
65 pub sequence: u64,
66 pub cursor: StorageCursor,
67}
68
69#[derive(Clone, Debug, PartialEq, Eq)]
70pub struct WriteCompletion {
71 pub batches: u64,
72 pub cursor: StorageCursor,
73}
74
75#[derive(Clone, Debug, PartialEq, Eq)]
78pub enum WriteReceipt {
79 Accepted(BatchReceipt),
80 Durable(BatchReceipt),
81}
82
83impl MemorySize for DataBatch {
88 fn memory_size(&self) -> usize {
89 std::mem::size_of::<Self>()
90 .saturating_add(self.destination.memory_size().saturating_sub(std::mem::size_of_val(&self.destination)))
91 .saturating_add(self.schema.memory_size().saturating_sub(std::mem::size_of_val(&self.schema)))
92 .saturating_add(self.data.memory_size().saturating_sub(std::mem::size_of_val(&self.data)))
93 }
94}
95
96impl MemorySize for BatchReceipt {
97 fn memory_size(&self) -> usize {
98 std::mem::size_of::<Self>().saturating_add(self.cursor.memory_size().saturating_sub(std::mem::size_of_val(&self.cursor)))
99 }
100}
101
102impl MemorySize for WriteReceipt {
103 fn memory_size(&self) -> usize {
104 let receipt = match self {
105 Self::Accepted(receipt) | Self::Durable(receipt) => receipt,
106 };
107 std::mem::size_of::<Self>().saturating_add(receipt.memory_size().saturating_sub(std::mem::size_of::<BatchReceipt>()))
108 }
109}
110
111impl MemorySize for WriteCompletion {
112 fn memory_size(&self) -> usize {
113 std::mem::size_of::<Self>().saturating_add(self.cursor.memory_size().saturating_sub(std::mem::size_of_val(&self.cursor)))
114 }
115}
116
117