Skip to content

Commit 62cddb9

Browse files
committed
refactor: use only the distribution version needed to download since migrations can be shared between multiple nodes
1 parent d64e1bd commit 62cddb9

File tree

3 files changed

+38
-73
lines changed

3 files changed

+38
-73
lines changed

internal/mithril-persistence/src/database/mod.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ mod version_checker;
1111

1212
pub use db_version::*;
1313
pub use hydrator::Hydrator;
14-
pub use version_checker::{DatabaseVersionChecker, NodeVersionRequirement, SqlMigration};
14+
pub use version_checker::{DatabaseVersionChecker, SqlMigration};
1515

1616
/// Database version.
1717
pub type DbVersion = i64;

internal/mithril-persistence/src/database/version_checker.rs

Lines changed: 35 additions & 65 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
use anyhow::{anyhow, Context};
22
use chrono::Utc;
3-
use semver::Version;
43
use slog::{debug, error, info, Logger};
54
use std::{cmp::Ordering, collections::BTreeSet};
65

@@ -165,13 +164,13 @@ insert into db_version (application_type, version, updated_at) values ('{applica
165164
return Ok(());
166165
}
167166

168-
if let Some(min_requirement) = &migration.minimum_requirement {
167+
if let Some(fallback_distribution_version) = &migration.fallback_distribution_version {
169168
let min_required_version = migration.version - 1;
170169
if db_version < min_required_version {
171170
return Err(anyhow!(
172171
r#"
173172
Minimum required database version is not met to apply migration '{}'.
174-
Please migrate your {} node database with the minimum node version compatible '{}' available in the release: '{}'.
173+
Please migrate your {} node database with the minimum node version compatible available in the distribution: '{}'.
175174
176175
First, download the required node version in your current directory by running the following command:
177176
curl --proto '=https' --tlsv1.2 -sSf https://raw.githubusercontent.com/input-output-hk/mithril/refs/heads/main/mithril-install.sh | sh -s -- -c mithril-{} -d {} -p $(pwd)
@@ -181,10 +180,9 @@ insert into db_version (application_type, version, updated_at) values ('{applica
181180
"#,
182181
migration.version,
183182
self.application_type.to_string(),
184-
min_requirement.node_version,
185-
min_requirement.release_version,
183+
fallback_distribution_version,
186184
self.application_type.to_string(),
187-
min_requirement.release_version,
185+
fallback_distribution_version,
188186
self.application_type.to_string()
189187
));
190188
}
@@ -194,16 +192,6 @@ insert into db_version (application_type, version, updated_at) values ('{applica
194192
}
195193
}
196194

197-
/// Node version requirement for a migration.
198-
#[derive(Debug, Clone)]
199-
pub struct NodeVersionRequirement {
200-
/// The node version required to apply a migration.
201-
pub node_version: Version,
202-
203-
/// The release version containing the required node version.
204-
pub release_version: String,
205-
}
206-
207195
/// Represent a file containing SQL structure or data alterations.
208196
#[derive(Debug, Clone)]
209197
pub struct SqlMigration {
@@ -213,8 +201,8 @@ pub struct SqlMigration {
213201
/// SQL statements to alter the database.
214202
pub alterations: String,
215203

216-
/// Indicates if this migration is squashed and the minimum node version required.
217-
pub minimum_requirement: Option<NodeVersionRequirement>,
204+
/// The distribution version the user can fallback to in order to update their database before updating to the latest node.
205+
pub fallback_distribution_version: Option<String>,
218206
}
219207

220208
impl SqlMigration {
@@ -223,20 +211,20 @@ impl SqlMigration {
223211
Self {
224212
version,
225213
alterations: alteration.into(),
226-
minimum_requirement: None,
214+
fallback_distribution_version: None,
227215
}
228216
}
229217

230-
/// Create a new squashed SQL migration instance with minimum node version requirement.
218+
/// Create a new squashed SQL migration instance with the fallback distribution version.
231219
pub fn new_squashed<T: Into<String>>(
232220
version: DbVersion,
233-
minimum_requirement: NodeVersionRequirement,
221+
fallback_distribution_version: T,
234222
alteration: T,
235223
) -> Self {
236224
Self {
237225
version,
238226
alterations: alteration.into(),
239-
minimum_requirement: Some(minimum_requirement),
227+
fallback_distribution_version: Some(fallback_distribution_version.into()),
240228
}
241229
}
242230
}
@@ -330,7 +318,7 @@ mod tests {
330318
let migration = SqlMigration {
331319
version: 1,
332320
alterations: alterations.to_string(),
333-
minimum_requirement: None,
321+
fallback_distribution_version: None,
334322
};
335323
db_checker.add_migration(migration);
336324
db_checker.apply().unwrap();
@@ -345,7 +333,7 @@ mod tests {
345333
let migration = SqlMigration {
346334
version: 2,
347335
alterations: alterations.to_string(),
348-
minimum_requirement: None,
336+
fallback_distribution_version: None,
349337
};
350338
db_checker.add_migration(migration);
351339
db_checker.apply().unwrap();
@@ -359,14 +347,14 @@ mod tests {
359347
let migration = SqlMigration {
360348
version: 4,
361349
alterations: alterations.to_string(),
362-
minimum_requirement: None,
350+
fallback_distribution_version: None,
363351
};
364352
db_checker.add_migration(migration);
365353
let alterations = "alter table whatever add column more_thing text; update whatever set more_thing = 'more thing'";
366354
let migration = SqlMigration {
367355
version: 3,
368356
alterations: alterations.to_string(),
369-
minimum_requirement: None,
357+
fallback_distribution_version: None,
370358
};
371359
db_checker.add_migration(migration);
372360
db_checker.apply().unwrap();
@@ -388,7 +376,7 @@ mod tests {
388376
let migration = SqlMigration {
389377
version: 3,
390378
alterations: alterations.to_string(),
391-
minimum_requirement: None,
379+
fallback_distribution_version: None,
392380
};
393381
db_checker.add_migration(migration);
394382
db_checker.apply().unwrap();
@@ -399,7 +387,7 @@ mod tests {
399387
let migration_with_version_gap = SqlMigration {
400388
version: 10,
401389
alterations: alterations.to_string(),
402-
minimum_requirement: None,
390+
fallback_distribution_version: None,
403391
};
404392
db_checker.add_migration(migration_with_version_gap);
405393
db_checker.apply().unwrap();
@@ -420,7 +408,7 @@ mod tests {
420408
let migration = SqlMigration {
421409
version: 1,
422410
alterations: alterations.to_string(),
423-
minimum_requirement: None,
411+
fallback_distribution_version: None,
424412
};
425413
db_checker.add_migration(migration);
426414
db_checker.apply().unwrap();
@@ -444,21 +432,21 @@ mod tests {
444432
let migration = SqlMigration {
445433
version: 1,
446434
alterations: alterations.to_string(),
447-
minimum_requirement: None,
435+
fallback_distribution_version: None,
448436
};
449437
db_checker.add_migration(migration);
450438
let alterations = "alter table wrong add column thing_content text; update whatever set thing_content = 'some content'";
451439
let migration = SqlMigration {
452440
version: 2,
453441
alterations: alterations.to_string(),
454-
minimum_requirement: None,
442+
fallback_distribution_version: None,
455443
};
456444
db_checker.add_migration(migration);
457445
let alterations = "alter table whatever add column thing_content text; update whatever set thing_content = 'some content'";
458446
let migration = SqlMigration {
459447
version: 3,
460448
alterations: alterations.to_string(),
461-
minimum_requirement: None,
449+
fallback_distribution_version: None,
462450
};
463451
db_checker.add_migration(migration);
464452
db_checker.apply().unwrap_err();
@@ -477,7 +465,7 @@ mod tests {
477465
let migration = SqlMigration {
478466
version: 1,
479467
alterations: alterations.to_string(),
480-
minimum_requirement: None,
468+
fallback_distribution_version: None,
481469
};
482470
db_checker.add_migration(migration);
483471
db_checker.apply().unwrap();
@@ -497,9 +485,9 @@ mod tests {
497485
}
498486

499487
#[test]
500-
fn check_minimum_required_version_does_not_fail_when_no_minimum_required_version() {
488+
fn check_minimum_required_version_does_not_fail_when_no_fallback_distribution_version() {
501489
let (_filepath, connection) = create_sqlite_file(
502-
"check_minimum_required_version_does_not_fail_when_no_minimum_required_version",
490+
"check_minimum_required_version_does_not_fail_when_no_fallback_distribution_version",
503491
)
504492
.unwrap();
505493
let db_checker = DatabaseVersionChecker::new(
@@ -512,21 +500,21 @@ mod tests {
512500
let migration = SqlMigration {
513501
version: 3,
514502
alterations: alterations.to_string(),
515-
minimum_requirement: None,
503+
fallback_distribution_version: None,
516504
};
517505

518506
db_checker
519507
.check_minimum_required_version(1, &migration)
520508
.expect(
521-
"Check minimum required version should not fail when no minimum required version",
522-
);
509+
"Check minimum required version should not fail when no fallback distribution version",
510+
);
523511
}
524512

525513
#[test]
526-
fn check_minimum_required_version_does_not_fail_when_minimum_required_version_with_fresh_database(
514+
fn check_minimum_required_version_does_not_fail_when_fallback_distribution_version_with_fresh_database(
527515
) {
528516
let (_filepath, connection) = create_sqlite_file(
529-
"check_minimum_required_version_does_not_fail_when_minimum_required_version_with_fresh_database",
517+
"check_minimum_required_version_does_not_fail_when_fallback_distribution_version_with_fresh_database",
530518
)
531519
.unwrap();
532520
let db_checker = DatabaseVersionChecker::new(
@@ -536,21 +524,15 @@ mod tests {
536524
);
537525

538526
let alterations = "create table whatever (thing_id integer); insert into whatever (thing_id) values (1), (2), (3), (4);";
539-
let min_requirement = NodeVersionRequirement {
540-
node_version: Version::parse("1.2.3").unwrap(),
541-
release_version: "2511.0".to_string(),
542-
};
543527
let migration = SqlMigration {
544528
version: 2,
545529
alterations: alterations.to_string(),
546-
minimum_requirement: Some(min_requirement),
530+
fallback_distribution_version: Some("2511.0".to_string()),
547531
};
548532

549533
db_checker
550534
.check_minimum_required_version(0, &migration)
551-
.expect(
552-
"Check minimum required version should not fail when no minimum required version",
553-
);
535+
.expect("Check minimum required version should not fail with fresh database");
554536
}
555537

556538
#[test]
@@ -567,14 +549,10 @@ mod tests {
567549
);
568550

569551
let alterations = "alter table whatever add column thing_content text; update whatever set thing_content = 'some content'";
570-
let min_requirement = NodeVersionRequirement {
571-
node_version: Version::parse("1.2.3").unwrap(),
572-
release_version: "2511.0".to_string(),
573-
};
574552
let migration = SqlMigration {
575553
version: 2,
576554
alterations: alterations.to_string(),
577-
minimum_requirement: Some(min_requirement),
555+
fallback_distribution_version: Some("2511.0".to_string()),
578556
};
579557

580558
db_checker
@@ -595,14 +573,10 @@ mod tests {
595573
);
596574

597575
let alterations = "alter table whatever add column thing_content text; update whatever set thing_content = 'some content'";
598-
let min_requirement = NodeVersionRequirement {
599-
node_version: Version::parse("1.2.3").unwrap(),
600-
release_version: "2511.0".to_string(),
601-
};
602576
let migration = SqlMigration {
603577
version: 3,
604578
alterations: alterations.to_string(),
605-
minimum_requirement: Some(min_requirement),
579+
fallback_distribution_version: Some("2511.0".to_string()),
606580
};
607581

608582
let error = db_checker
@@ -626,27 +600,23 @@ mod tests {
626600
let migration = SqlMigration {
627601
version: 1,
628602
alterations: alterations.to_string(),
629-
minimum_requirement: None,
603+
fallback_distribution_version: None,
630604
};
631605
db_checker.add_migration(migration);
632606
db_checker.apply().unwrap();
633607
check_database_version(&connection, 1);
634608

635609
let alterations = "alter table whatever add column thing_content text; update whatever set thing_content = 'some content'";
636-
let min_requirement = NodeVersionRequirement {
637-
node_version: Version::parse("1.2.3").unwrap(),
638-
release_version: "2511.0".to_string(),
639-
};
640610
let squashed_migration = SqlMigration {
641611
version: 3,
642612
alterations: alterations.to_string(),
643-
minimum_requirement: Some(min_requirement),
613+
fallback_distribution_version: Some("2511.0".to_string()),
644614
};
645615
db_checker.add_migration(squashed_migration);
646616

647617
let error = db_checker
648618
.apply()
649-
.expect_err("Should fail with minimum version error");
619+
.expect_err("Should fail when applying squashed migration on old database");
650620

651621
assert!(error.to_string().contains("curl --proto '=https' --tlsv1.2 -sSf https://raw.githubusercontent.com/input-output-hk/mithril/refs/heads/main/mithril-install.sh | sh -s -- -c mithril-aggregator -d 2511.0 -p $(pwd)"));
652622
}

mithril-aggregator/src/database/migration.rs

Lines changed: 2 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,6 @@
11
//! Migration module
22
//!
3-
use semver::Version;
4-
5-
use mithril_persistence::database::{NodeVersionRequirement, SqlMigration};
3+
use mithril_persistence::database::SqlMigration;
64

75
/// Get all the migrations required by this version of the software.
86
/// There shall be one migration per database version. There could be several
@@ -11,10 +9,7 @@ pub fn get_migrations() -> Vec<SqlMigration> {
119
vec![
1210
SqlMigration::new_squashed(
1311
29,
14-
NodeVersionRequirement {
15-
node_version: Version::parse("0.2.228").unwrap(),
16-
release_version: "2445.0".to_string(),
17-
},
12+
"2445.0",
1813
r#"
1914
create table if not exists signed_entity_type (
2015
signed_entity_type_id integer not null,

0 commit comments

Comments
 (0)