Skip to content

Commit 830ffeb

Browse files
dlachaumeturmelclemjpraynaud
committed
fix(mithril-client): create missing protocolMagicId file during download of Cardano database
Co-authored-by: Clément TURMEL <[email protected]> Co-authored-by: Jean-Philippe Raynaud <[email protected]>
1 parent 47178ad commit 830ffeb

File tree

4 files changed

+134
-1
lines changed

4 files changed

+134
-1
lines changed

mithril-client/src/cardano_database_client/download_unpack/internal_downloader.rs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ use mithril_common::messages::{
1414
use crate::cardano_database_client::ImmutableFileRange;
1515
use crate::feedback::{FeedbackSender, MithrilEvent, MithrilEventCardanoDatabase};
1616
use crate::file_downloader::{DownloadEvent, FileDownloader, FileDownloaderUri};
17-
use crate::utils::{AncillaryVerifier, VecDequeExtensions};
17+
use crate::utils::{create_bootstrap_node_files, AncillaryVerifier, VecDequeExtensions};
1818
use crate::MithrilResult;
1919

2020
use super::download_task::{DownloadKind, DownloadTask, LocationToDownload};
@@ -86,6 +86,8 @@ impl InternalArtifactDownloader {
8686
self.batch_download_unpack(tasks, download_unpack_options.max_parallel_downloads)
8787
.await?;
8888

89+
create_bootstrap_node_files(&self.logger, target_dir, &cardano_database_snapshot.network)?;
90+
8991
self.feedback_sender
9092
.send_event(MithrilEvent::CardanoDatabase(
9193
MithrilEventCardanoDatabase::Completed {

mithril-client/src/snapshot_client.rs

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -118,6 +118,8 @@ use crate::feedback::FeedbackSender;
118118
#[cfg(feature = "fs")]
119119
use crate::file_downloader::{DownloadEvent, FileDownloader};
120120
#[cfg(feature = "fs")]
121+
use crate::utils::create_bootstrap_node_files;
122+
#[cfg(feature = "fs")]
121123
use crate::utils::AncillaryVerifier;
122124
use crate::{MithrilResult, Snapshot, SnapshotListItem};
123125

@@ -232,6 +234,11 @@ impl SnapshotClient {
232234
.await?;
233235
self.download_unpack_ancillary(snapshot, target_dir, &download_id)
234236
.await?;
237+
create_bootstrap_node_files(
238+
&self.logger,
239+
target_dir,
240+
&snapshot.network,
241+
)?;
235242

236243
Ok(())
237244
}
@@ -252,6 +259,11 @@ impl SnapshotClient {
252259
let download_id = MithrilEvent::new_snapshot_download_id();
253260
self.download_unpack_immutables_files(snapshot, target_dir, &download_id)
254261
.await?;
262+
create_bootstrap_node_files(
263+
&self.logger,
264+
target_dir,
265+
&snapshot.network,
266+
)?;
255267

256268
Ok(())
257269
}
Lines changed: 117 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,117 @@
1+
use std::{fs::File, io::Write, path::Path};
2+
3+
use slog::{warn, Logger};
4+
5+
use mithril_common::CardanoNetwork;
6+
7+
use crate::MithrilResult;
8+
9+
const CLEAN_FILE_NAME: &str = "clean";
10+
const PROTOCOL_MAGIC_ID_FILENAME: &str = "protocolMagicId";
11+
12+
pub fn create_bootstrap_node_files(
13+
logger: &Logger,
14+
db_dir: &Path,
15+
network: &str,
16+
) -> MithrilResult<()> {
17+
if let Err(error) = File::create(db_dir.join(CLEAN_FILE_NAME)) {
18+
warn!(
19+
logger, "Could not create clean shutdown marker file in directory '{}'", db_dir.display();
20+
"error" => error.to_string()
21+
);
22+
};
23+
24+
if let Ok(network) = CardanoNetwork::from_code(network.to_string(), None) {
25+
let mut file = File::create(db_dir.join(PROTOCOL_MAGIC_ID_FILENAME))?;
26+
file.write_all(format!("{}", network.code()).as_bytes())?;
27+
};
28+
29+
Ok(())
30+
}
31+
32+
#[cfg(test)]
33+
mod test {
34+
use mithril_common::{temp_dir, CardanoNetwork};
35+
use slog::o;
36+
37+
use super::*;
38+
39+
#[test]
40+
fn create_bootstrap_node_files_creates_protocol_magic_id_and_clean_files_for_mainnet() {
41+
let db_dir = temp_dir!().join("db");
42+
std::fs::create_dir_all(&db_dir).unwrap();
43+
let network = CardanoNetwork::from_code("mainnet".to_string(), None).unwrap();
44+
let logger = slog::Logger::root(slog::Discard, o!());
45+
46+
create_bootstrap_node_files(&logger, &db_dir, &network.to_string()).unwrap();
47+
48+
let file_content =
49+
std::fs::read_to_string(db_dir.join(PROTOCOL_MAGIC_ID_FILENAME)).unwrap();
50+
assert_eq!(file_content, network.code().to_string());
51+
52+
assert!(db_dir.join(CLEAN_FILE_NAME).exists());
53+
}
54+
55+
#[test]
56+
fn create_bootstrap_node_files_creates_protocol_magic_id_and_clean_files_for_preprod() {
57+
let db_dir = temp_dir!().join("db");
58+
std::fs::create_dir_all(&db_dir).unwrap();
59+
let network = CardanoNetwork::from_code("preprod".to_string(), None).unwrap();
60+
let logger = slog::Logger::root(slog::Discard, o!());
61+
62+
create_bootstrap_node_files(&logger, &db_dir, &network.to_string()).unwrap();
63+
64+
let file_content =
65+
std::fs::read_to_string(db_dir.join(PROTOCOL_MAGIC_ID_FILENAME)).unwrap();
66+
assert_eq!(file_content, network.code().to_string());
67+
68+
assert!(db_dir.join(CLEAN_FILE_NAME).exists());
69+
}
70+
71+
#[test]
72+
fn create_bootstrap_node_files_creates_protocol_magic_id_and_clean_files_for_preview() {
73+
let db_dir = temp_dir!().join("db");
74+
std::fs::create_dir_all(&db_dir).unwrap();
75+
let network = CardanoNetwork::from_code("preview".to_string(), None).unwrap();
76+
let logger = slog::Logger::root(slog::Discard, o!());
77+
78+
create_bootstrap_node_files(&logger, &db_dir, &network.to_string()).unwrap();
79+
80+
let file_content =
81+
std::fs::read_to_string(db_dir.join(PROTOCOL_MAGIC_ID_FILENAME)).unwrap();
82+
assert_eq!(file_content, network.code().to_string());
83+
84+
assert!(db_dir.join(CLEAN_FILE_NAME).exists());
85+
}
86+
87+
#[test]
88+
fn create_bootstrap_node_files_creates_protocol_magic_id_and_clean_files_for_testnet() {
89+
let db_dir = temp_dir!().join("db");
90+
std::fs::create_dir_all(&db_dir).unwrap();
91+
let network = CardanoNetwork::from_code("testnet".to_string(), None).unwrap();
92+
let logger = slog::Logger::root(slog::Discard, o!());
93+
94+
create_bootstrap_node_files(&logger, &db_dir, &network.to_string()).unwrap();
95+
96+
let file_content =
97+
std::fs::read_to_string(db_dir.join(PROTOCOL_MAGIC_ID_FILENAME)).unwrap();
98+
assert_eq!(file_content, network.code().to_string());
99+
100+
assert!(db_dir.join(CLEAN_FILE_NAME).exists());
101+
}
102+
103+
#[test]
104+
fn create_bootstrap_node_files_does_not_create_protocol_magic_id_file_and_create_clean_file_for_devnet(
105+
) {
106+
let db_dir = temp_dir!().join("db");
107+
std::fs::create_dir_all(&db_dir).unwrap();
108+
let network = CardanoNetwork::from_code("devnet".to_string(), Some(123)).unwrap();
109+
let logger = slog::Logger::root(slog::Discard, o!());
110+
111+
create_bootstrap_node_files(&logger, &db_dir, &network.to_string()).unwrap();
112+
113+
assert!(!db_dir.join(PROTOCOL_MAGIC_ID_FILENAME).exists());
114+
115+
assert!(db_dir.join(CLEAN_FILE_NAME).exists());
116+
}
117+
}

mithril-client/src/utils/mod.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,11 @@
44
cfg_fs! {
55
mod ancillary_verifier;
66
mod stream_reader;
7+
mod bootstrap_files;
78

89
pub use ancillary_verifier::AncillaryVerifier;
910
pub use stream_reader::*;
11+
pub use bootstrap_files::*;
1012
}
1113

1214
cfg_fs_unstable! {

0 commit comments

Comments
 (0)