fix dump v3

This commit is contained in:
mpostma 2021-09-29 15:24:59 +02:00 committed by Tamo
parent 03af99650d
commit 66f39aaa92
No known key found for this signature in database
GPG Key ID: 20CD8020AFA88D69
4 changed files with 42 additions and 64 deletions

View File

@ -1,2 +1,3 @@
pub mod v1; pub mod v1;
pub mod v2; pub mod v3;

View File

@ -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(())
}
}

View File

@ -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)?;

View File

@ -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());