Dumpless upgrade

This commit is contained in:
ManyTheFish 2025-02-17 16:37:17 +01:00
parent 285c72a960
commit 9505f15c85
2 changed files with 42 additions and 6 deletions

View File

@ -3,7 +3,7 @@ mod v1_13;
use heed::RwTxn; use heed::RwTxn;
use v1_12::{V1_12_3_To_V1_13_0, V1_12_To_V1_12_3}; use v1_12::{V1_12_3_To_V1_13_0, V1_12_To_V1_12_3};
use v1_13::V1_13_0_To_Current; use v1_13::{V1_13_0_To_V1_13_1, V1_13_1_To_Current};
use crate::progress::{Progress, VariableNameStep}; use crate::progress::{Progress, VariableNameStep};
use crate::{Index, InternalError, Result}; use crate::{Index, InternalError, Result};
@ -28,13 +28,18 @@ pub fn upgrade(
progress: Progress, progress: Progress,
) -> Result<bool> { ) -> Result<bool> {
let from = index.get_version(wtxn)?.unwrap_or(db_version); let from = index.get_version(wtxn)?.unwrap_or(db_version);
let upgrade_functions: &[&dyn UpgradeIndex] = let upgrade_functions: &[&dyn UpgradeIndex] = &[
&[&V1_12_To_V1_12_3 {}, &V1_12_3_To_V1_13_0 {}, &V1_13_0_To_Current()]; &V1_12_To_V1_12_3 {},
&V1_12_3_To_V1_13_0 {},
&V1_13_0_To_V1_13_1 {},
&V1_13_1_To_Current {},
];
let start = match from { let start = match from {
(1, 12, 0..=2) => 0, (1, 12, 0..=2) => 0,
(1, 12, 3..) => 1, (1, 12, 3..) => 1,
(1, 13, 0) => 2, (1, 13, 0) => 2,
(1, 13, 1) => 3,
// We must handle the current version in the match because in case of a failure some index may have been upgraded but not other. // We must handle the current version in the match because in case of a failure some index may have been upgraded but not other.
(1, 13, _) => return Ok(false), (1, 13, _) => return Ok(false),
(major, minor, patch) => { (major, minor, patch) => {

View File

@ -2,13 +2,44 @@ use heed::RwTxn;
use super::UpgradeIndex; use super::UpgradeIndex;
use crate::constants::{VERSION_MAJOR, VERSION_MINOR, VERSION_PATCH}; use crate::constants::{VERSION_MAJOR, VERSION_MINOR, VERSION_PATCH};
use crate::database_stats::DatabaseStats;
use crate::progress::Progress; use crate::progress::Progress;
use crate::{Index, Result}; use crate::{make_enum_progress, Index, Result};
#[allow(non_camel_case_types)] #[allow(non_camel_case_types)]
pub(super) struct V1_13_0_To_Current(); pub(super) struct V1_13_0_To_V1_13_1();
impl UpgradeIndex for V1_13_0_To_Current { impl UpgradeIndex for V1_13_0_To_V1_13_1 {
fn upgrade(
&self,
wtxn: &mut RwTxn,
index: &Index,
_original: (u32, u32, u32),
progress: Progress,
) -> Result<bool> {
make_enum_progress! {
enum DocumentsStats {
CreatingDocumentsStats,
}
};
// Create the new documents stats.
progress.update_progress(DocumentsStats::CreatingDocumentsStats);
let stats = DatabaseStats::new(index.documents.remap_types(), wtxn)?;
index.put_documents_stats(wtxn, stats)?;
Ok(true)
}
fn target_version(&self) -> (u32, u32, u32) {
(1, 13, 1)
}
}
#[allow(non_camel_case_types)]
pub(super) struct V1_13_1_To_Current();
impl UpgradeIndex for V1_13_1_To_Current {
fn upgrade( fn upgrade(
&self, &self,
_wtxn: &mut RwTxn, _wtxn: &mut RwTxn,