meilisearch/meilisearch-http/src/index_controller/snapshot.rs

60 lines
1.6 KiB
Rust
Raw Normal View History

2021-03-17 18:53:23 +08:00
use std::path::PathBuf;
use std::time::Duration;
2021-03-20 03:08:00 +08:00
use std::fs::create_dir_all;
2021-03-17 18:53:23 +08:00
use tokio::time::interval;
2021-03-20 03:08:00 +08:00
use uuid::Uuid;
2021-03-17 18:53:23 +08:00
use super::index_actor::IndexActorHandle;
use super::update_actor::UpdateActorHandle;
use super::uuid_resolver::UuidResolverHandle;
#[allow(dead_code)]
pub struct SnapshotService<B> {
index_handle: IndexActorHandle,
uuid_resolver_handle: UuidResolverHandle,
update_handle: UpdateActorHandle<B>,
snapshot_period: Duration,
snapshot_path: PathBuf,
}
impl<B> SnapshotService<B> {
pub fn new(
index_handle: IndexActorHandle,
uuid_resolver_handle: UuidResolverHandle,
update_handle: UpdateActorHandle<B>,
snapshot_period: Duration,
snapshot_path: PathBuf,
) -> Self {
Self {
index_handle,
uuid_resolver_handle,
update_handle,
snapshot_period,
snapshot_path,
}
}
pub async fn run(self) {
let mut interval = interval(self.snapshot_period);
loop {
interval.tick().await;
2021-03-20 03:08:00 +08:00
self.perform_snapshot().await.unwrap();
2021-03-17 18:53:23 +08:00
}
}
2021-03-20 03:08:00 +08:00
async fn perform_snapshot(&self) -> anyhow::Result<()> {
let temp_snapshot_path = self
.snapshot_path
.join(format!("tmp-{}", Uuid::new_v4()));
create_dir_all(&temp_snapshot_path)?;
let uuids = self.uuid_resolver_handle.snapshot(temp_snapshot_path.clone()).await?;
2021-03-20 18:50:57 +08:00
for uuid in uuids {
self.update_handle.snapshot(uuid, temp_snapshot_path.clone()).await?;
println!("performed snapshot for index {}", uuid);
2021-03-20 18:50:57 +08:00
}
2021-03-20 03:08:00 +08:00
Ok(())
2021-03-17 18:53:23 +08:00
}
}