mirror of
https://github.com/meilisearch/meilisearch.git
synced 2024-11-26 20:15:07 +08:00
Merge #3122
3122: Display the `dumpUid` as `null` until we create it r=irevoire a=Kerollmops This PR fixes #3117 by displaying the `DumpCreation` `dumpUid` details field as `null` until we compute the dump and the task is finished. Co-authored-by: Kerollmops <clement@meilisearch.com>
This commit is contained in:
commit
f724f8adfe
@ -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,
|
||||||
}
|
}
|
||||||
|
@ -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,
|
||||||
|
@ -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 } => {
|
||||||
|
@ -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,
|
||||||
},
|
},
|
||||||
|
@ -487,10 +487,8 @@ impl IndexScheduler {
|
|||||||
assert_ne!(status, Status::Succeeded);
|
assert_ne!(status, Status::Succeeded);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Details::Dump { dump_uid: d1 } => {
|
Details::Dump { dump_uid: _ } => {
|
||||||
assert!(
|
assert_eq!(kind.as_kind(), Kind::DumpCreation);
|
||||||
matches!(&kind, KindWithContent::DumpCreation { dump_uid: d2, keys: _, instance_uid: _ } if &d1 == d2 )
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -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();
|
||||||
|
@ -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>>>,
|
||||||
|
@ -983,7 +983,7 @@ async fn test_summarized_dump_creation() {
|
|||||||
server.wait_task(0).await;
|
server.wait_task(0).await;
|
||||||
let (task, _) = server.get_task(0).await;
|
let (task, _) = server.get_task(0).await;
|
||||||
assert_json_snapshot!(task,
|
assert_json_snapshot!(task,
|
||||||
{ ".duration" => "[duration]", ".enqueuedAt" => "[date]", ".startedAt" => "[date]", ".finishedAt" => "[date]" },
|
{ ".details.dumpUid" => "[dumpUid]", ".duration" => "[duration]", ".enqueuedAt" => "[date]", ".startedAt" => "[date]", ".finishedAt" => "[date]" },
|
||||||
@r###"
|
@r###"
|
||||||
{
|
{
|
||||||
"uid": 0,
|
"uid": 0,
|
||||||
@ -991,6 +991,9 @@ async fn test_summarized_dump_creation() {
|
|||||||
"status": "succeeded",
|
"status": "succeeded",
|
||||||
"type": "dumpCreation",
|
"type": "dumpCreation",
|
||||||
"canceledBy": null,
|
"canceledBy": null,
|
||||||
|
"details": {
|
||||||
|
"dumpUid": "[dumpUid]"
|
||||||
|
},
|
||||||
"error": null,
|
"error": null,
|
||||||
"duration": "[duration]",
|
"duration": "[duration]",
|
||||||
"enqueuedAt": "[date]",
|
"enqueuedAt": "[date]",
|
||||||
|
@ -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> },
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user