mirror of
https://github.com/meilisearch/MeiliSearch
synced 2024-11-26 06:44:27 +01:00
fix dump v3
This commit is contained in:
parent
03af99650d
commit
66f39aaa92
@ -1,2 +1,3 @@
|
|||||||
pub mod v1;
|
pub mod v1;
|
||||||
pub mod v2;
|
pub mod v3;
|
||||||
|
|
||||||
|
@ -1,52 +0,0 @@
|
|||||||
use std::path::Path;
|
|
||||||
|
|
||||||
use chrono::{DateTime, Utc};
|
|
||||||
use log::info;
|
|
||||||
use serde::{Deserialize, Serialize};
|
|
||||||
|
|
||||||
use crate::index_controller::index_resolver::IndexResolver;
|
|
||||||
use crate::index_controller::update_file_store::UpdateFileStore;
|
|
||||||
use crate::index_controller::updates::store::UpdateStore;
|
|
||||||
use crate::options::IndexerOpts;
|
|
||||||
|
|
||||||
#[derive(Serialize, Deserialize, Debug)]
|
|
||||||
#[serde(rename_all = "camelCase")]
|
|
||||||
pub struct MetadataV2 {
|
|
||||||
db_version: String,
|
|
||||||
index_db_size: usize,
|
|
||||||
update_db_size: usize,
|
|
||||||
dump_date: DateTime<Utc>,
|
|
||||||
}
|
|
||||||
|
|
||||||
impl MetadataV2 {
|
|
||||||
pub fn new(index_db_size: usize, update_db_size: usize) -> Self {
|
|
||||||
Self {
|
|
||||||
db_version: env!("CARGO_PKG_VERSION").to_string(),
|
|
||||||
index_db_size,
|
|
||||||
update_db_size,
|
|
||||||
dump_date: Utc::now(),
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
pub fn load_dump(
|
|
||||||
self,
|
|
||||||
src: impl AsRef<Path>,
|
|
||||||
dst: impl AsRef<Path>,
|
|
||||||
index_db_size: usize,
|
|
||||||
update_db_size: usize,
|
|
||||||
indexing_options: &IndexerOpts,
|
|
||||||
) -> anyhow::Result<()> {
|
|
||||||
info!(
|
|
||||||
"Loading dump from {}, dump database version: {}, dump version: V2",
|
|
||||||
self.dump_date, self.db_version
|
|
||||||
);
|
|
||||||
|
|
||||||
IndexResolver::load_dump(src.as_ref(), &dst, index_db_size, indexing_options)?;
|
|
||||||
UpdateFileStore::load_dump(src.as_ref(), &dst)?;
|
|
||||||
UpdateStore::load_dump(&src, &dst, update_db_size)?;
|
|
||||||
|
|
||||||
info!("Loading indexes.");
|
|
||||||
|
|
||||||
Ok(())
|
|
||||||
}
|
|
||||||
}
|
|
@ -8,7 +8,6 @@ use serde::{Deserialize, Serialize};
|
|||||||
use tokio::fs::create_dir_all;
|
use tokio::fs::create_dir_all;
|
||||||
|
|
||||||
use loaders::v1::MetadataV1;
|
use loaders::v1::MetadataV1;
|
||||||
use loaders::v2::MetadataV2;
|
|
||||||
|
|
||||||
pub use actor::DumpActor;
|
pub use actor::DumpActor;
|
||||||
pub use handle_impl::*;
|
pub use handle_impl::*;
|
||||||
@ -18,6 +17,7 @@ use super::index_resolver::HardStateIndexResolver;
|
|||||||
use super::updates::UpdateSender;
|
use super::updates::UpdateSender;
|
||||||
use crate::compression::{from_tar_gz, to_tar_gz};
|
use crate::compression::{from_tar_gz, to_tar_gz};
|
||||||
use crate::index_controller::dump_actor::error::DumpActorError;
|
use crate::index_controller::dump_actor::error::DumpActorError;
|
||||||
|
use crate::index_controller::dump_actor::loaders::v3;
|
||||||
use crate::index_controller::updates::UpdateMsg;
|
use crate::index_controller::updates::UpdateMsg;
|
||||||
use crate::options::IndexerOpts;
|
use crate::options::IndexerOpts;
|
||||||
use error::Result;
|
use error::Result;
|
||||||
@ -30,6 +30,27 @@ mod message;
|
|||||||
|
|
||||||
const META_FILE_NAME: &str = "metadata.json";
|
const META_FILE_NAME: &str = "metadata.json";
|
||||||
|
|
||||||
|
#[derive(Serialize, Deserialize, Debug)]
|
||||||
|
#[serde(rename_all = "camelCase")]
|
||||||
|
pub struct Metadata {
|
||||||
|
db_version: String,
|
||||||
|
index_db_size: usize,
|
||||||
|
update_db_size: usize,
|
||||||
|
dump_date: DateTime<Utc>,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Metadata {
|
||||||
|
pub fn new(index_db_size: usize, update_db_size: usize) -> Self {
|
||||||
|
Self {
|
||||||
|
db_version: env!("CARGO_PKG_VERSION").to_string(),
|
||||||
|
index_db_size,
|
||||||
|
update_db_size,
|
||||||
|
dump_date: Utc::now(),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
#[async_trait::async_trait]
|
#[async_trait::async_trait]
|
||||||
pub trait DumpActorHandle {
|
pub trait DumpActorHandle {
|
||||||
/// Start the creation of a dump
|
/// Start the creation of a dump
|
||||||
@ -43,15 +64,16 @@ pub trait DumpActorHandle {
|
|||||||
|
|
||||||
#[derive(Debug, Serialize, Deserialize)]
|
#[derive(Debug, Serialize, Deserialize)]
|
||||||
#[serde(tag = "dumpVersion")]
|
#[serde(tag = "dumpVersion")]
|
||||||
pub enum Metadata {
|
pub enum MetadataVersion {
|
||||||
V1(MetadataV1),
|
V1(MetadataV1),
|
||||||
V2(MetadataV2),
|
V2(Metadata),
|
||||||
|
V3(Metadata),
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Metadata {
|
impl MetadataVersion {
|
||||||
pub fn new_v2(index_db_size: usize, update_db_size: usize) -> Self {
|
pub fn new_v3(index_db_size: usize, update_db_size: usize) -> Self {
|
||||||
let meta = MetadataV2::new(index_db_size, update_db_size);
|
let meta = Metadata::new(index_db_size, update_db_size);
|
||||||
Self::V2(meta)
|
Self::V3(meta)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -125,23 +147,25 @@ pub fn load_dump(
|
|||||||
|
|
||||||
let meta_path = tmp_src_path.join(META_FILE_NAME);
|
let meta_path = tmp_src_path.join(META_FILE_NAME);
|
||||||
let mut meta_file = File::open(&meta_path)?;
|
let mut meta_file = File::open(&meta_path)?;
|
||||||
let meta: Metadata = serde_json::from_reader(&mut meta_file)?;
|
let meta: MetadataVersion = serde_json::from_reader(&mut meta_file)?;
|
||||||
|
|
||||||
let tmp_dst = tempfile::tempdir()?;
|
let tmp_dst = tempfile::tempdir()?;
|
||||||
|
|
||||||
println!("temp path: {}", tmp_dst.path().display());
|
println!("temp path: {}", tmp_dst.path().display());
|
||||||
|
|
||||||
match meta {
|
match meta {
|
||||||
Metadata::V1(meta) => {
|
MetadataVersion::V1(meta) => {
|
||||||
meta.load_dump(&tmp_src_path, tmp_dst.path(), index_db_size, indexer_opts)?
|
meta.load_dump(&tmp_src_path, tmp_dst.path(), index_db_size, indexer_opts)?
|
||||||
}
|
}
|
||||||
Metadata::V2(meta) => meta.load_dump(
|
MetadataVersion::V3(meta) => v3::load_dump(
|
||||||
|
meta,
|
||||||
&tmp_src_path,
|
&tmp_src_path,
|
||||||
tmp_dst.path(),
|
tmp_dst.path(),
|
||||||
index_db_size,
|
index_db_size,
|
||||||
update_db_size,
|
update_db_size,
|
||||||
indexer_opts,
|
indexer_opts,
|
||||||
)?,
|
)?,
|
||||||
|
MetadataVersion::V2(_) => todo!(),
|
||||||
}
|
}
|
||||||
// Persist and atomically rename the db
|
// Persist and atomically rename the db
|
||||||
let persisted_dump = tmp_dst.into_path();
|
let persisted_dump = tmp_dst.into_path();
|
||||||
@ -173,7 +197,7 @@ impl DumpTask {
|
|||||||
let temp_dump_dir = tokio::task::spawn_blocking(tempfile::TempDir::new).await??;
|
let temp_dump_dir = tokio::task::spawn_blocking(tempfile::TempDir::new).await??;
|
||||||
let temp_dump_path = temp_dump_dir.path().to_owned();
|
let temp_dump_path = temp_dump_dir.path().to_owned();
|
||||||
|
|
||||||
let meta = Metadata::new_v2(self.index_db_size, self.update_db_size);
|
let meta = MetadataVersion::new_v3(self.index_db_size, self.update_db_size);
|
||||||
let meta_path = temp_dump_path.join(META_FILE_NAME);
|
let meta_path = temp_dump_path.join(META_FILE_NAME);
|
||||||
let mut meta_file = File::create(&meta_path)?;
|
let mut meta_file = File::create(&meta_path)?;
|
||||||
serde_json::to_writer(&mut meta_file, &meta)?;
|
serde_json::to_writer(&mut meta_file, &meta)?;
|
||||||
|
@ -73,6 +73,11 @@ impl UpdateFileStore {
|
|||||||
let src_update_files_path = src.as_ref().join(UPDATE_FILES_PATH);
|
let src_update_files_path = src.as_ref().join(UPDATE_FILES_PATH);
|
||||||
let dst_update_files_path = dst.as_ref().join(UPDATE_FILES_PATH);
|
let dst_update_files_path = dst.as_ref().join(UPDATE_FILES_PATH);
|
||||||
|
|
||||||
|
// No update files to load
|
||||||
|
if !src_update_files_path.exists() {
|
||||||
|
return Ok(())
|
||||||
|
}
|
||||||
|
|
||||||
create_dir_all(&dst_update_files_path)?;
|
create_dir_all(&dst_update_files_path)?;
|
||||||
|
|
||||||
println!("src_update file: {}", src_update_files_path.display());
|
println!("src_update file: {}", src_update_files_path.display());
|
||||||
|
Loading…
Reference in New Issue
Block a user