Skip to content

Commit b083c06

Browse files
committed
refacto: Group snapshotter information into a DigestSnapshotter
1 parent 744d9ed commit b083c06

File tree

3 files changed

+79
-58
lines changed

3 files changed

+79
-58
lines changed

mithril-aggregator/src/artifact_builder/cardano_database.rs

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -147,7 +147,9 @@ mod tests {
147147
use mockall::{predicate, Predicate};
148148

149149
use crate::{
150-
artifact_builder::{MockAncillaryFileUploader, MockImmutableFilesUploader},
150+
artifact_builder::{
151+
DigestSnapshotter, MockAncillaryFileUploader, MockImmutableFilesUploader,
152+
},
151153
immutable_file_digest_mapper::MockImmutableFileDigestMapper,
152154
services::{DumbSnapshotter, FakeSnapshotter},
153155
test_tools::TestLogger,
@@ -270,8 +272,10 @@ mod tests {
270272
DigestArtifactBuilder::new(
271273
SanitizedUrlWithTrailingSlash::parse("http://aggregator_uri").unwrap(),
272274
vec![],
273-
Arc::new(DumbSnapshotter::new()),
274-
CompressionAlgorithm::Gzip,
275+
DigestSnapshotter {
276+
snapshotter: Arc::new(DumbSnapshotter::new()),
277+
compression_algorithm: CompressionAlgorithm::Gzip,
278+
},
275279
network,
276280
test_dir.join("digests"),
277281
Arc::new(immutable_file_digest_mapper),

mithril-aggregator/src/artifact_builder/cardano_database_artifacts/digest.rs

Lines changed: 64 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -86,16 +86,37 @@ pub struct DigestUpload {
8686
pub size: u64,
8787
}
8888

89+
pub struct DigestSnapshotter {
90+
pub snapshotter: Arc<dyn Snapshotter>,
91+
pub compression_algorithm: CompressionAlgorithm,
92+
}
93+
94+
impl DigestSnapshotter {
95+
fn create_archive_file(&self, digest_file_name: PathBuf) -> Result<PathBuf, anyhow::Error> {
96+
let digest_archive_file_path =
97+
digest_file_name.with_extension(self.compression_algorithm.tar_file_extension());
98+
let ongoing_digests_archive = self
99+
.snapshotter
100+
.snapshot_subset(&digest_archive_file_path, vec![digest_file_name.clone()])
101+
.with_context(|| {
102+
format!(
103+
"Could not create snapshot of digest file: '{}'",
104+
digest_file_name.display()
105+
)
106+
})?;
107+
108+
Ok(ongoing_digests_archive.get_file_path().clone())
109+
}
110+
}
111+
89112
pub struct DigestArtifactBuilder {
90113
/// Aggregator URL prefix
91114
aggregator_url_prefix: SanitizedUrlWithTrailingSlash,
92115

93116
/// Uploaders
94117
uploaders: Vec<Arc<dyn DigestFileUploader>>,
95118

96-
snapshotter: Arc<dyn Snapshotter>,
97-
98-
compression_algorithm: CompressionAlgorithm,
119+
digest_snapshotter: DigestSnapshotter,
99120

100121
network: CardanoNetwork,
101122

@@ -111,8 +132,7 @@ impl DigestArtifactBuilder {
111132
pub fn new(
112133
aggregator_url_prefix: SanitizedUrlWithTrailingSlash,
113134
uploaders: Vec<Arc<dyn DigestFileUploader>>,
114-
snapshotter: Arc<dyn Snapshotter>,
115-
compression_algorithm: CompressionAlgorithm,
135+
digest_snapshotter: DigestSnapshotter,
116136
network: CardanoNetwork,
117137
digests_dir: PathBuf,
118138
immutable_file_digest_mapper: Arc<dyn ImmutableFileDigestMapper>,
@@ -121,8 +141,7 @@ impl DigestArtifactBuilder {
121141
Ok(Self {
122142
aggregator_url_prefix,
123143
uploaders,
124-
snapshotter,
125-
compression_algorithm,
144+
digest_snapshotter,
126145
network,
127146
digests_dir,
128147
immutable_file_digest_mapper,
@@ -132,7 +151,11 @@ impl DigestArtifactBuilder {
132151

133152
pub async fn upload(&self, beacon: &CardanoDbBeacon) -> StdResult<DigestUpload> {
134153
let digest_path = self.create_digest_file(beacon).await?;
135-
let digest_archive_file_path = self.create_archive_file(beacon)?;
154+
let digest_file_name =
155+
PathBuf::from(Self::get_digests_file_name(&self.network, beacon, "json"));
156+
let digest_archive_file_path = self
157+
.digest_snapshotter
158+
.create_archive_file(digest_file_name)?;
136159

137160
let locations = self.upload_digest_file(&digest_archive_file_path).await;
138161

@@ -165,26 +188,6 @@ impl DigestArtifactBuilder {
165188
})
166189
}
167190

168-
fn create_archive_file(&self, beacon: &CardanoDbBeacon) -> Result<PathBuf, anyhow::Error> {
169-
let digest_archive_file_path = PathBuf::from(Self::get_digests_file_name(
170-
&self.network,
171-
beacon,
172-
&self.compression_algorithm.tar_file_extension(),
173-
));
174-
let digest_file_name =
175-
PathBuf::from(Self::get_digests_file_name(&self.network, beacon, "json"));
176-
self.snapshotter
177-
.snapshot_subset(&digest_archive_file_path, vec![digest_file_name.clone()])
178-
.with_context(|| {
179-
format!(
180-
"Could not create snapshot of digest file: '{}'",
181-
digest_file_name.display()
182-
)
183-
})?;
184-
185-
Ok(digest_archive_file_path)
186-
}
187-
188191
async fn create_digest_file(&self, beacon: &CardanoDbBeacon) -> StdResult<PathBuf> {
189192
let immutable_file_digest_map = self
190193
.immutable_file_digest_mapper
@@ -342,8 +345,10 @@ mod tests {
342345
let builder = DigestArtifactBuilder::new(
343346
SanitizedUrlWithTrailingSlash::parse("https://aggregator/").unwrap(),
344347
vec![],
345-
Arc::new(DumbSnapshotter::new()),
346-
CompressionAlgorithm::Gzip,
348+
DigestSnapshotter {
349+
snapshotter: Arc::new(DumbSnapshotter::new()),
350+
compression_algorithm: CompressionAlgorithm::Gzip,
351+
},
347352
CardanoNetwork::DevNet(123),
348353
temp_dir,
349354
Arc::new(immutable_file_digest_mapper),
@@ -372,8 +377,10 @@ mod tests {
372377
let builder = DigestArtifactBuilder::new(
373378
SanitizedUrlWithTrailingSlash::parse("https://aggregator/").unwrap(),
374379
vec![],
375-
Arc::new(DumbSnapshotter::new()),
376-
CompressionAlgorithm::Gzip,
380+
DigestSnapshotter {
381+
snapshotter: Arc::new(DumbSnapshotter::new()),
382+
compression_algorithm: CompressionAlgorithm::Gzip,
383+
},
377384
CardanoNetwork::DevNet(123),
378385
temp_dir,
379386
Arc::new(immutable_file_digest_mapper),
@@ -404,8 +411,10 @@ mod tests {
404411
let builder = DigestArtifactBuilder::new(
405412
SanitizedUrlWithTrailingSlash::parse("https://aggregator/").unwrap(),
406413
vec![Arc::new(uploader)],
407-
Arc::new(DumbSnapshotter::new()),
408-
CompressionAlgorithm::Gzip,
414+
DigestSnapshotter {
415+
snapshotter: Arc::new(DumbSnapshotter::new()),
416+
compression_algorithm: CompressionAlgorithm::Gzip,
417+
},
409418
CardanoNetwork::DevNet(123),
410419
PathBuf::from("/tmp/whatever"),
411420
Arc::new(MockImmutableFileDigestMapper::new()),
@@ -427,8 +436,10 @@ mod tests {
427436
let builder = DigestArtifactBuilder::new(
428437
SanitizedUrlWithTrailingSlash::parse("https://aggregator/").unwrap(),
429438
vec![Arc::new(uploader)],
430-
Arc::new(DumbSnapshotter::new()),
431-
CompressionAlgorithm::Gzip,
439+
DigestSnapshotter {
440+
snapshotter: Arc::new(DumbSnapshotter::new()),
441+
compression_algorithm: CompressionAlgorithm::Gzip,
442+
},
432443
CardanoNetwork::DevNet(123),
433444
PathBuf::from("/tmp/whatever"),
434445
Arc::new(MockImmutableFileDigestMapper::new()),
@@ -459,8 +470,10 @@ mod tests {
459470
let builder = DigestArtifactBuilder::new(
460471
SanitizedUrlWithTrailingSlash::parse("https://aggregator/").unwrap(),
461472
uploaders,
462-
Arc::new(DumbSnapshotter::new()),
463-
CompressionAlgorithm::Gzip,
473+
DigestSnapshotter {
474+
snapshotter: Arc::new(DumbSnapshotter::new()),
475+
compression_algorithm: CompressionAlgorithm::Gzip,
476+
},
464477
CardanoNetwork::DevNet(123),
465478
PathBuf::from("/tmp/whatever"),
466479
Arc::new(MockImmutableFileDigestMapper::new()),
@@ -498,8 +511,10 @@ mod tests {
498511
let builder = DigestArtifactBuilder::new(
499512
SanitizedUrlWithTrailingSlash::parse("https://aggregator/").unwrap(),
500513
uploaders,
501-
Arc::new(DumbSnapshotter::new()),
502-
CompressionAlgorithm::Gzip,
514+
DigestSnapshotter {
515+
snapshotter: Arc::new(DumbSnapshotter::new()),
516+
compression_algorithm: CompressionAlgorithm::Gzip,
517+
},
503518
CardanoNetwork::DevNet(123),
504519
PathBuf::from("/tmp/whatever"),
505520
Arc::new(MockImmutableFileDigestMapper::new()),
@@ -546,8 +561,10 @@ mod tests {
546561
let builder = DigestArtifactBuilder::new(
547562
SanitizedUrlWithTrailingSlash::parse("https://aggregator/").unwrap(),
548563
vec![],
549-
Arc::new(DumbSnapshotter::new()),
550-
CompressionAlgorithm::Gzip,
564+
DigestSnapshotter {
565+
snapshotter: Arc::new(DumbSnapshotter::new()),
566+
compression_algorithm: CompressionAlgorithm::Gzip,
567+
},
551568
CardanoNetwork::DevNet(123),
552569
temp_dir,
553570
Arc::new(immutable_file_digest_mapper),
@@ -598,15 +615,10 @@ mod tests {
598615
&beacon,
599616
&compression_algorithm.tar_file_extension(),
600617
);
601-
let digest_archive_file = PathBuf::from(DigestArtifactBuilder::get_digests_file_name(
602-
&network,
603-
&beacon,
604-
&compression_algorithm.tar_file_extension(),
605-
));
606618

607619
digest_file_uploader
608620
.expect_upload()
609-
.with(eq(digest_archive_file), eq(None))
621+
.with(eq(archive_path.clone()), eq(None))
610622
.times(1)
611623
.return_once(move |_, _| {
612624
assert!(
@@ -639,8 +651,10 @@ mod tests {
639651
let builder = DigestArtifactBuilder::new(
640652
SanitizedUrlWithTrailingSlash::parse("https://aggregator/").unwrap(),
641653
vec![Arc::new(digest_file_uploader)],
642-
Arc::new(snapshotter),
643-
compression_algorithm,
654+
DigestSnapshotter {
655+
snapshotter: Arc::new(snapshotter),
656+
compression_algorithm: CompressionAlgorithm::Gzip,
657+
},
644658
network,
645659
digests_dir.clone(),
646660
Arc::new(immutable_file_digest_mapper),

mithril-aggregator/src/dependency_injection/builder/protocol/artifacts.rs

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,8 @@ use crate::artifact_builder::{
88
AncillaryArtifactBuilder, AncillaryFileUploader, CardanoDatabaseArtifactBuilder,
99
CardanoImmutableFilesFullArtifactBuilder, CardanoStakeDistributionArtifactBuilder,
1010
CardanoTransactionsArtifactBuilder, DigestArtifactBuilder, DigestFileUploader,
11-
ImmutableArtifactBuilder, ImmutableFilesUploader, MithrilStakeDistributionArtifactBuilder,
11+
DigestSnapshotter, ImmutableArtifactBuilder, ImmutableFilesUploader,
12+
MithrilStakeDistributionArtifactBuilder,
1213
};
1314
use crate::dependency_injection::builder::SNAPSHOT_ARTIFACTS_DIR;
1415
use crate::dependency_injection::{DependenciesBuilder, DependenciesBuilderError, Result};
@@ -132,10 +133,9 @@ impl DependenciesBuilder {
132133
async fn build_digests_snapshotter(
133134
&mut self,
134135
digests_path: PathBuf,
135-
) -> Result<Arc<dyn Snapshotter>> {
136+
) -> Result<DigestSnapshotter> {
136137
let snapshotter: Arc<dyn Snapshotter> = match self.configuration.environment {
137138
ExecutionEnvironment::Production => {
138-
// TODO should we use get_snapshot_dir ?
139139
let ongoing_snapshot_directory =
140140
self.configuration.get_snapshot_dir()?.join("digests");
141141

@@ -151,7 +151,10 @@ impl DependenciesBuilder {
151151
_ => Arc::new(DumbSnapshotter::new()),
152152
};
153153

154-
Ok(snapshotter)
154+
Ok(DigestSnapshotter {
155+
snapshotter,
156+
compression_algorithm: self.configuration.snapshot_compression_algorithm,
157+
})
155158
}
156159

157160
/// [Snapshotter] service.
@@ -382,11 +385,11 @@ impl DependenciesBuilder {
382385

383386
let digests_path = snapshot_dir.join("pending_cardano_database_digests");
384387
let digests_snapshotter = self.build_digests_snapshotter(digests_path.clone()).await?;
388+
385389
let digest_builder = Arc::new(DigestArtifactBuilder::new(
386390
self.configuration.get_server_url()?,
387391
self.build_cardano_database_digests_uploaders()?,
388392
digests_snapshotter,
389-
CompressionAlgorithm::Gzip,
390393
self.configuration.get_network()?,
391394
digests_path,
392395
self.get_immutable_file_digest_mapper().await?,

0 commit comments

Comments
 (0)