From 1db550ec7f46984a3532eee859672a449389bc68 Mon Sep 17 00:00:00 2001 From: Tamo Date: Thu, 3 Apr 2025 15:47:56 +0200 Subject: [PATCH] make meilisearch accept cancelation tasks even when the disk is full --- crates/index-scheduler/src/lib.rs | 4 +-- crates/index-scheduler/src/queue/mod.rs | 2 -- crates/index-scheduler/src/queue/test.rs | 33 ++++++++++++++++++++++-- 3 files changed, 33 insertions(+), 6 deletions(-) diff --git a/crates/index-scheduler/src/lib.rs b/crates/index-scheduler/src/lib.rs index 5c8517650..99f62983a 100644 --- a/crates/index-scheduler/src/lib.rs +++ b/crates/index-scheduler/src/lib.rs @@ -625,8 +625,8 @@ impl IndexScheduler { task_id: Option, dry_run: bool, ) -> Result { - // if the task doesn't delete anything and 50% of the task queue is full, we must refuse to enqueue the incomming task - if !matches!(&kind, KindWithContent::TaskDeletion { tasks, .. } if !tasks.is_empty()) + // if the task doesn't delete or cancel anything and 40% of the task queue is full, we must refuse to enqueue the incomming task + if !matches!(&kind, KindWithContent::TaskDeletion { tasks, .. } | KindWithContent::TaskCancelation { tasks, .. } if !tasks.is_empty()) && (self.env.non_free_pages_size()? * 100) / self.env.info().map_size as u64 > 40 { return Err(Error::NoSpaceLeftInTaskQueue); diff --git a/crates/index-scheduler/src/queue/mod.rs b/crates/index-scheduler/src/queue/mod.rs index b13e3ffe2..92de10fe1 100644 --- a/crates/index-scheduler/src/queue/mod.rs +++ b/crates/index-scheduler/src/queue/mod.rs @@ -292,8 +292,6 @@ impl Queue { return Ok(task); } - // Get rid of the mutability. - let task = task; self.tasks.register(wtxn, &task)?; Ok(task) diff --git a/crates/index-scheduler/src/queue/test.rs b/crates/index-scheduler/src/queue/test.rs index 3dbdd2db3..91f412025 100644 --- a/crates/index-scheduler/src/queue/test.rs +++ b/crates/index-scheduler/src/queue/test.rs @@ -364,7 +364,7 @@ fn test_task_queue_is_full() { // we won't be able to test this error in an integration test thus as a best effort test I still ensure the error return the expected error code snapshot!(format!("{:?}", result.error_code()), @"NoSpaceLeftOnDevice"); - // Even the task deletion that doesn't delete anything shouldn't be accepted + // Even the task deletion and cancelation that don't delete anything shouldn be refused let result = index_scheduler .register( KindWithContent::TaskDeletion { query: S("test"), tasks: RoaringBitmap::new() }, @@ -373,10 +373,39 @@ fn test_task_queue_is_full() { ) .unwrap_err(); snapshot!(result, @"Meilisearch cannot receive write operations because the limit of the task database has been reached. Please delete tasks to continue performing write operations."); + let result = index_scheduler + .register( + KindWithContent::TaskCancelation { query: S("test"), tasks: RoaringBitmap::new() }, + None, + false, + ) + .unwrap_err(); + snapshot!(result, @"Meilisearch cannot receive write operations because the limit of the task database has been reached. Please delete tasks to continue performing write operations."); + // we won't be able to test this error in an integration test thus as a best effort test I still ensure the error return the expected error code snapshot!(format!("{:?}", result.error_code()), @"NoSpaceLeftOnDevice"); - // But a task deletion that delete something should works + // But a task cancelation that cancel something should works + index_scheduler + .register( + KindWithContent::TaskCancelation { query: S("test"), tasks: (0..100).collect() }, + None, + false, + ) + .unwrap(); + handle.advance_one_successful_batch(); + + // But we should still be forbidden from enqueuing new tasks + let result = index_scheduler + .register( + KindWithContent::IndexCreation { index_uid: S("doggo"), primary_key: None }, + None, + false, + ) + .unwrap_err(); + snapshot!(result, @"Meilisearch cannot receive write operations because the limit of the task database has been reached. Please delete tasks to continue performing write operations."); + + // And a task deletion that delete something should works index_scheduler .register( KindWithContent::TaskDeletion { query: S("test"), tasks: (0..100).collect() },