Skip to content

Commit 11307af

Browse files
Alenardlachaume
andcommitted
feat(aggregator): add compute_uncompressed_data_size to TarAppender
To allow computation of the uncompressed size at the same time the archive is made. Co-authored-by: Damien Lachaume <[email protected]>
1 parent d15e4f9 commit 11307af

File tree

1 file changed

+97
-0
lines changed

1 file changed

+97
-0
lines changed

mithril-aggregator/src/tools/file_archiver/appender.rs

Lines changed: 97 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,13 @@ use std::path::PathBuf;
55

66
use mithril_common::StdResult;
77

8+
use crate::tools::file_size;
9+
810
/// Define multiple ways to append content to a tar archive.
911
pub trait TarAppender {
1012
fn append<T: Write>(&self, tar: &mut tar::Builder<T>) -> StdResult<()>;
13+
14+
fn compute_uncompressed_data_size(&self) -> StdResult<u64>;
1115
}
1216

1317
pub struct AppenderDirAll {
@@ -31,6 +35,10 @@ impl TarAppender for AppenderDirAll {
3135
})?;
3236
Ok(())
3337
}
38+
39+
fn compute_uncompressed_data_size(&self) -> StdResult<u64> {
40+
file_size::compute_size_of_path(&self.target_directory)
41+
}
3442
}
3543

3644
pub struct AppenderFile {
@@ -80,6 +88,10 @@ impl TarAppender for AppenderFile {
8088
})?;
8189
Ok(())
8290
}
91+
92+
fn compute_uncompressed_data_size(&self) -> StdResult<u64> {
93+
file_size::compute_size_of_path(&self.target_file)
94+
}
8395
}
8496

8597
pub struct AppenderEntries {
@@ -132,10 +144,22 @@ impl TarAppender for AppenderEntries {
132144
}
133145
Ok(())
134146
}
147+
148+
fn compute_uncompressed_data_size(&self) -> StdResult<u64> {
149+
let full_entries_path = self
150+
.entries
151+
.iter()
152+
.map(|entry| self.base_directory.join(entry))
153+
.collect();
154+
file_size::compute_size(full_entries_path)
155+
}
135156
}
136157

137158
#[cfg(test)]
138159
mod tests {
160+
use mithril_common::digesters::{
161+
DummyCardanoDbBuilder, IMMUTABLE_DIR, LEDGER_DIR, VOLATILE_DIR,
162+
};
139163
use mithril_common::entities::CompressionAlgorithm;
140164

141165
use crate::tools::file_archiver::test_tools::*;
@@ -278,4 +302,77 @@ mod tests {
278302
get_test_directory("appender_file_should_return_error_if_input_is_not_a_file");
279303
assert!(AppenderFile::append_at_archive_root(test_dir).is_err());
280304
}
305+
306+
#[test]
307+
fn appender_dir_all_compute_size() {
308+
let test_dir = "appender_dir_all_compute_size";
309+
310+
let immutable_trio_file_size = 777;
311+
let ledger_file_size = 6666;
312+
let volatile_file_size = 99;
313+
314+
let cardano_db = DummyCardanoDbBuilder::new(test_dir)
315+
.with_immutables(&[1, 2])
316+
.set_immutable_trio_file_size(immutable_trio_file_size)
317+
.with_ledger_files(&["437", "537", "637"])
318+
.set_ledger_file_size(ledger_file_size)
319+
.with_volatile_files(&["blocks-0.dat"])
320+
.set_volatile_file_size(volatile_file_size)
321+
.build();
322+
323+
let appender_dir_all = AppenderDirAll::new(cardano_db.get_dir().clone());
324+
325+
let entries_size = appender_dir_all.compute_uncompressed_data_size().unwrap();
326+
let expected_total_size =
327+
(immutable_trio_file_size * 2) + (3 * ledger_file_size) + volatile_file_size;
328+
assert_eq!(expected_total_size, entries_size);
329+
}
330+
331+
#[test]
332+
fn appender_file_all_compute_size() {
333+
let test_dir = get_test_directory("appender_file_all_compute_size");
334+
335+
let file_path = test_dir.join("file.txt");
336+
let file = File::create(&file_path).unwrap();
337+
file.set_len(777).unwrap();
338+
339+
let appender_file = AppenderFile::append_at_archive_root(file_path).unwrap();
340+
341+
let entries_size = appender_file.compute_uncompressed_data_size().unwrap();
342+
assert_eq!(777, entries_size);
343+
}
344+
345+
#[test]
346+
fn appender_entries_compute_size_of_its_paths() {
347+
let test_dir = "appender_entries_compute_size_of_its_paths";
348+
349+
let immutable_trio_file_size = 777;
350+
let ledger_file_size = 6666;
351+
let volatile_file_size = 99;
352+
353+
let cardano_db = DummyCardanoDbBuilder::new(test_dir)
354+
.with_immutables(&[1, 2, 3])
355+
.set_immutable_trio_file_size(immutable_trio_file_size)
356+
.with_ledger_files(&["437", "537", "637", "737"])
357+
.set_ledger_file_size(ledger_file_size)
358+
.with_volatile_files(&["blocks-0.dat", "blocks-1.dat", "blocks-2.dat"])
359+
.set_volatile_file_size(volatile_file_size)
360+
.build();
361+
362+
let appender_entries = AppenderEntries::new(
363+
vec![
364+
PathBuf::from(IMMUTABLE_DIR),
365+
PathBuf::from(LEDGER_DIR).join("437"),
366+
PathBuf::from(LEDGER_DIR).join("537"),
367+
PathBuf::from(VOLATILE_DIR).join("blocks-0.dat"),
368+
],
369+
cardano_db.get_dir().clone(),
370+
)
371+
.unwrap();
372+
373+
let entries_size = appender_entries.compute_uncompressed_data_size().unwrap();
374+
let expected_total_size =
375+
(immutable_trio_file_size * 3) + (2 * ledger_file_size) + volatile_file_size;
376+
assert_eq!(expected_total_size, entries_size);
377+
}
281378
}

0 commit comments

Comments
 (0)