Display a null dumpUid until we computed the dump itself on disk

This commit is contained in:
Kerollmops 2022-11-23 14:49:25 +01:00
parent 7093bae131
commit cde2a96486
No known key found for this signature in database
GPG Key ID: 92ADA4E935E71FA4
7 changed files with 26 additions and 34 deletions

View File

@ -87,7 +87,7 @@ pub struct TaskDump {
pub finished_at: Option<OffsetDateTime>, pub finished_at: Option<OffsetDateTime>,
} }
// A `Kind` specific version made for the dump. If modified you may break the dump. // A `Kind` specific version made for the dump. If modified you may break the dump.
#[derive(Debug, PartialEq, Serialize, Deserialize)] #[derive(Debug, PartialEq, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")] #[serde(rename_all = "camelCase")]
pub enum KindDump { pub enum KindDump {
@ -125,7 +125,6 @@ pub enum KindDump {
tasks: RoaringBitmap, tasks: RoaringBitmap,
}, },
DumpCreation { DumpCreation {
dump_uid: String,
keys: Vec<Key>, keys: Vec<Key>,
instance_uid: Option<InstanceUid>, instance_uid: Option<InstanceUid>,
}, },
@ -188,8 +187,8 @@ impl From<KindWithContent> for KindDump {
KindWithContent::TaskDeletion { query, tasks } => { KindWithContent::TaskDeletion { query, tasks } => {
KindDump::TasksDeletion { query, tasks } KindDump::TasksDeletion { query, tasks }
} }
KindWithContent::DumpCreation { dump_uid, keys, instance_uid } => { KindWithContent::DumpCreation { keys, instance_uid } => {
KindDump::DumpCreation { dump_uid, keys, instance_uid } KindDump::DumpCreation { keys, instance_uid }
} }
KindWithContent::SnapshotCreation => KindDump::SnapshotCreation, KindWithContent::SnapshotCreation => KindDump::SnapshotCreation,
} }

View File

@ -119,11 +119,10 @@ impl CompatV5ToV6 {
allow_index_creation, allow_index_creation,
settings: Box::new(settings.into()), settings: Box::new(settings.into()),
}, },
v5::tasks::TaskContent::Dump { uid } => v6::Kind::DumpCreation { v5::tasks::TaskContent::Dump { uid: _ } => {
dump_uid: uid, // in v6 we compute the dump_uid from the started_at processing time
keys: keys.clone(), v6::Kind::DumpCreation { keys: keys.clone(), instance_uid }
instance_uid, }
},
}, },
canceled_by: None, canceled_by: None,
details: task_view.details.map(|details| match details { details: task_view.details.map(|details| match details {
@ -149,7 +148,9 @@ impl CompatV5ToV6 {
v5::Details::ClearAll { deleted_documents } => { v5::Details::ClearAll { deleted_documents } => {
v6::Details::ClearAll { deleted_documents } v6::Details::ClearAll { deleted_documents }
} }
v5::Details::Dump { dump_uid } => v6::Details::Dump { dump_uid }, v5::Details::Dump { dump_uid } => {
v6::Details::Dump { dump_uid: Some(dump_uid) }
}
}), }),
error: task_view.error.map(|e| e.into()), error: task_view.error.map(|e| e.into()),
enqueued_at: task_view.enqueued_at, enqueued_at: task_view.enqueued_at,

View File

@ -36,6 +36,7 @@ use meilisearch_types::settings::{apply_settings_to_builder, Settings, Unchecked
use meilisearch_types::tasks::{Details, IndexSwap, Kind, KindWithContent, Status, Task}; use meilisearch_types::tasks::{Details, IndexSwap, Kind, KindWithContent, Status, Task};
use meilisearch_types::{compression, Index, VERSION_FILE_NAME}; use meilisearch_types::{compression, Index, VERSION_FILE_NAME};
use roaring::RoaringBitmap; use roaring::RoaringBitmap;
use time::macros::format_description;
use time::OffsetDateTime; use time::OffsetDateTime;
use uuid::Uuid; use uuid::Uuid;
@ -680,11 +681,9 @@ impl IndexScheduler {
} }
Batch::Dump(mut task) => { Batch::Dump(mut task) => {
let started_at = OffsetDateTime::now_utc(); let started_at = OffsetDateTime::now_utc();
let (keys, instance_uid, dump_uid) = let (keys, instance_uid) =
if let KindWithContent::DumpCreation { keys, instance_uid, dump_uid } = if let KindWithContent::DumpCreation { keys, instance_uid } = &task.kind {
&task.kind (keys, instance_uid)
{
(keys, instance_uid, dump_uid)
} else { } else {
unreachable!(); unreachable!();
}; };
@ -771,12 +770,17 @@ impl IndexScheduler {
index_dumper.settings(&settings)?; index_dumper.settings(&settings)?;
} }
let dump_uid = started_at.format(format_description!(
"[year repr:full][month repr:numerical][day padding:zero]-[hour padding:zero][minute padding:zero][second padding:zero][subsecond digits:3]"
)).unwrap();
let path = self.dumps_path.join(format!("{}.dump", dump_uid)); let path = self.dumps_path.join(format!("{}.dump", dump_uid));
let file = File::create(path)?; let file = File::create(path)?;
dump.persist_to(BufWriter::new(file))?; dump.persist_to(BufWriter::new(file))?;
// if we reached this step we can tell the scheduler we succeeded to dump ourselves. // if we reached this step we can tell the scheduler we succeeded to dump ourselves.
task.status = Status::Succeeded; task.status = Status::Succeeded;
task.details = Some(Details::Dump { dump_uid: Some(dump_uid) });
Ok(vec![task]) Ok(vec![task])
} }
Batch::IndexOperation { op, must_create_index } => { Batch::IndexOperation { op, must_create_index } => {

View File

@ -826,8 +826,8 @@ impl IndexScheduler {
KindDump::TasksDeletion { query, tasks } => { KindDump::TasksDeletion { query, tasks } => {
KindWithContent::TaskDeletion { query, tasks } KindWithContent::TaskDeletion { query, tasks }
} }
KindDump::DumpCreation { dump_uid, keys, instance_uid } => { KindDump::DumpCreation { keys, instance_uid } => {
KindWithContent::DumpCreation { dump_uid, keys, instance_uid } KindWithContent::DumpCreation { keys, instance_uid }
} }
KindDump::SnapshotCreation => KindWithContent::SnapshotCreation, KindDump::SnapshotCreation => KindWithContent::SnapshotCreation,
}, },

View File

@ -6,8 +6,6 @@ use meilisearch_auth::AuthController;
use meilisearch_types::error::ResponseError; use meilisearch_types::error::ResponseError;
use meilisearch_types::tasks::KindWithContent; use meilisearch_types::tasks::KindWithContent;
use serde_json::json; use serde_json::json;
use time::macros::format_description;
use time::OffsetDateTime;
use crate::analytics::Analytics; use crate::analytics::Analytics;
use crate::extractors::authentication::policies::*; use crate::extractors::authentication::policies::*;
@ -27,16 +25,9 @@ pub async fn create_dump(
) -> Result<HttpResponse, ResponseError> { ) -> Result<HttpResponse, ResponseError> {
analytics.publish("Dump Created".to_string(), json!({}), Some(&req)); analytics.publish("Dump Created".to_string(), json!({}), Some(&req));
let dump_uid = OffsetDateTime::now_utc()
.format(format_description!(
"[year repr:full][month repr:numerical][day padding:zero]-[hour padding:zero][minute padding:zero][second padding:zero][subsecond digits:3]"
))
.unwrap();
let task = KindWithContent::DumpCreation { let task = KindWithContent::DumpCreation {
keys: auth_controller.list_keys()?, keys: auth_controller.list_keys()?,
instance_uid: analytics.instance_uid().cloned(), instance_uid: analytics.instance_uid().cloned(),
dump_uid,
}; };
let task: SummarizedTaskView = let task: SummarizedTaskView =
tokio::task::spawn_blocking(move || index_scheduler.register(task)).await??.into(); tokio::task::spawn_blocking(move || index_scheduler.register(task)).await??.into();

View File

@ -98,7 +98,7 @@ pub struct DetailsView {
#[serde(skip_serializing_if = "Option::is_none")] #[serde(skip_serializing_if = "Option::is_none")]
pub original_filter: Option<String>, pub original_filter: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")] #[serde(skip_serializing_if = "Option::is_none")]
pub dump_uid: Option<String>, pub dump_uid: Option<Option<String>>,
#[serde(skip_serializing_if = "Option::is_none")] #[serde(skip_serializing_if = "Option::is_none")]
#[serde(flatten)] #[serde(flatten)]
pub settings: Option<Box<Settings<Unchecked>>>, pub settings: Option<Box<Settings<Unchecked>>>,

View File

@ -127,7 +127,6 @@ pub enum KindWithContent {
tasks: RoaringBitmap, tasks: RoaringBitmap,
}, },
DumpCreation { DumpCreation {
dump_uid: String,
keys: Vec<Key>, keys: Vec<Key>,
instance_uid: Option<InstanceUid>, instance_uid: Option<InstanceUid>,
}, },
@ -223,7 +222,7 @@ impl KindWithContent {
deleted_tasks: None, deleted_tasks: None,
original_filter: query.clone(), original_filter: query.clone(),
}), }),
KindWithContent::DumpCreation { .. } => None, KindWithContent::DumpCreation { .. } => Some(Details::Dump { dump_uid: None }),
KindWithContent::SnapshotCreation => None, KindWithContent::SnapshotCreation => None,
} }
} }
@ -266,7 +265,7 @@ impl KindWithContent {
deleted_tasks: Some(0), deleted_tasks: Some(0),
original_filter: query.clone(), original_filter: query.clone(),
}), }),
KindWithContent::DumpCreation { .. } => None, KindWithContent::DumpCreation { .. } => Some(Details::Dump { dump_uid: None }),
KindWithContent::SnapshotCreation => None, KindWithContent::SnapshotCreation => None,
} }
} }
@ -304,9 +303,7 @@ impl From<&KindWithContent> for Option<Details> {
deleted_tasks: None, deleted_tasks: None,
original_filter: query.clone(), original_filter: query.clone(),
}), }),
KindWithContent::DumpCreation { dump_uid, .. } => { KindWithContent::DumpCreation { .. } => Some(Details::Dump { dump_uid: None }),
Some(Details::Dump { dump_uid: dump_uid.clone() })
}
KindWithContent::SnapshotCreation => None, KindWithContent::SnapshotCreation => None,
} }
} }
@ -469,7 +466,7 @@ pub enum Details {
ClearAll { deleted_documents: Option<u64> }, ClearAll { deleted_documents: Option<u64> },
TaskCancelation { matched_tasks: u64, canceled_tasks: Option<u64>, original_filter: String }, TaskCancelation { matched_tasks: u64, canceled_tasks: Option<u64>, original_filter: String },
TaskDeletion { matched_tasks: u64, deleted_tasks: Option<u64>, original_filter: String }, TaskDeletion { matched_tasks: u64, deleted_tasks: Option<u64>, original_filter: String },
Dump { dump_uid: String }, Dump { dump_uid: Option<String> },
IndexSwap { swaps: Vec<IndexSwap> }, IndexSwap { swaps: Vec<IndexSwap> },
} }