@@ -81,15 +81,21 @@ pub trait DiskFormatUpgrade {
81
81
}
82
82
}
83
83
84
- fn format_upgrades ( ) -> Vec < Box < dyn DiskFormatUpgrade > > {
85
- // Note: Disk format upgrades must be run in order.
86
- vec ! [
84
+ fn format_upgrades (
85
+ min_version : Option < Version > ,
86
+ ) -> impl Iterator < Item = Box < dyn DiskFormatUpgrade > > {
87
+ let min_version = move || min_version. clone ( ) . unwrap_or ( Version :: new ( 0 , 0 , 0 ) ) ;
88
+
89
+ // Note: Disk format upgrades must be run in order of database version.
90
+ ( [
87
91
Box :: new ( prune_trees:: PruneTrees ) ,
88
92
Box :: new ( add_subtrees:: AddSubtrees ) ,
89
93
Box :: new ( tree_keys_and_caches_upgrade:: FixTreeKeyTypeAndCacheGenesisRoots ) ,
90
94
// Value balance upgrade
91
95
Box :: new ( no_migration:: NoMigration :: new ( 26 , 0 , 0 ) ) ,
92
- ]
96
+ ] as [ Box < dyn DiskFormatUpgrade > ; 4 ] )
97
+ . into_iter ( )
98
+ . filter ( move |upgrade| upgrade. version ( ) > min_version ( ) )
93
99
}
94
100
95
101
/// The kind of database format change or validity check we're performing.
@@ -532,53 +538,30 @@ impl DbFormatChange {
532
538
} ;
533
539
534
540
// Apply or validate format upgrades
535
- for upgrade in format_upgrades ( ) {
536
- if older_disk_version >= & upgrade. version ( ) {
541
+ for upgrade in format_upgrades ( Some ( older_disk_version. clone ( ) ) ) {
542
+ if upgrade. needs_migration ( ) {
543
+ let timer = CodeTimer :: start ( ) ;
544
+
545
+ upgrade. prepare ( initial_tip_height, db, cancel_receiver, older_disk_version) ?;
546
+ upgrade. run ( initial_tip_height, db, cancel_receiver) ?;
547
+
548
+ // Before marking the state as upgraded, check that the upgrade completed successfully.
537
549
upgrade
538
550
. validate ( db, cancel_receiver) ?
539
- . expect ( "failed to validate db format" ) ;
540
- continue ;
541
- }
551
+ . expect ( "db should be valid after upgrade" ) ;
542
552
543
- if !upgrade. needs_migration ( ) {
544
- Self :: mark_as_upgraded_to ( db, & upgrade. version ( ) ) ;
545
- continue ;
553
+ timer. finish ( module_path ! ( ) , line ! ( ) , upgrade. description ( ) ) ;
546
554
}
547
555
548
- let timer = CodeTimer :: start ( ) ;
549
-
550
- upgrade. prepare ( initial_tip_height, db, cancel_receiver, older_disk_version) ?;
551
- upgrade. run ( initial_tip_height, db, cancel_receiver) ?;
552
-
553
- // Before marking the state as upgraded, check that the upgrade completed successfully.
554
- upgrade
555
- . validate ( db, cancel_receiver) ?
556
- . expect ( "db should be valid after upgrade" ) ;
557
-
558
556
// Mark the database as upgraded. Zebra won't repeat the upgrade anymore once the
559
557
// database is marked, so the upgrade MUST be complete at this point.
560
558
info ! (
561
559
newer_running_version = ?upgrade. version( ) ,
562
560
"Zebra automatically upgraded the database format"
563
561
) ;
564
562
Self :: mark_as_upgraded_to ( db, & upgrade. version ( ) ) ;
565
-
566
- timer. finish ( module_path ! ( ) , line ! ( ) , upgrade. description ( ) ) ;
567
563
}
568
564
569
- let version_for_upgrading_value_balance_format =
570
- Version :: parse ( "26.0.0" ) . expect ( "hard-coded version string should be valid" ) ;
571
-
572
- // Check if we need to do the upgrade.
573
- if older_disk_version < & version_for_upgrading_value_balance_format {
574
- Self :: mark_as_upgraded_to ( db, & version_for_upgrading_value_balance_format)
575
- }
576
-
577
- info ! (
578
- %newer_running_version,
579
- "Zebra automatically upgraded the database format to:"
580
- ) ;
581
-
582
565
Ok ( ( ) )
583
566
}
584
567
@@ -625,7 +608,7 @@ impl DbFormatChange {
625
608
// Do the quick checks first, so we don't have to do this in every detailed check.
626
609
results. push ( Self :: format_validity_checks_quick ( db) ) ;
627
610
628
- for upgrade in format_upgrades ( ) {
611
+ for upgrade in format_upgrades ( None ) {
629
612
results. push ( upgrade. validate ( db, cancel_receiver) ?) ;
630
613
}
631
614
@@ -842,3 +825,12 @@ impl Drop for DbFormatChangeThreadHandle {
842
825
}
843
826
}
844
827
}
828
+
829
+ #[ test]
830
+ fn format_upgrades_are_in_version_order ( ) {
831
+ let mut last_version = Version :: new ( 0 , 0 , 0 ) ;
832
+ for upgrade in format_upgrades ( None ) {
833
+ assert ! ( upgrade. version( ) > last_version) ;
834
+ last_version = upgrade. version ( ) ;
835
+ }
836
+ }
0 commit comments