diff --git a/meilisearch-http/src/index_controller/update_actor/store/mod.rs b/meilisearch-http/src/index_controller/update_actor/store/mod.rs index 34e364497..99593cac8 100644 --- a/meilisearch-http/src/index_controller/update_actor/store/mod.rs +++ b/meilisearch-http/src/index_controller/update_actor/store/mod.rs @@ -470,13 +470,6 @@ impl UpdateStore { txn.commit()?; - uuids_to_remove - .iter() - .map(|uuid| update_uuid_to_file_path(&self.path, *uuid)) - .for_each(|path| { - let _ = remove_file(path); - }); - // If the currently processing update is from our index, we wait until it is // finished before returning. This ensure that no write to the index occurs after we delete it. if let State::Processing(uuid, _) = *self.state.read() { @@ -486,6 +479,16 @@ impl UpdateStore { } } + // Finally, remove any outstanding update files. This must be done after waiting for the + // last update to ensure that the update files are not deleted before the update needs + // them. + uuids_to_remove + .iter() + .map(|uuid| update_uuid_to_file_path(&self.path, *uuid)) + .for_each(|path| { + let _ = remove_file(path); + }); + Ok(()) } diff --git a/meilisearch-http/tests/index/delete_index.rs b/meilisearch-http/tests/index/delete_index.rs index b0f067b24..6ce9587fc 100644 --- a/meilisearch-http/tests/index/delete_index.rs +++ b/meilisearch-http/tests/index/delete_index.rs @@ -1,3 +1,5 @@ +use serde_json::json; + use crate::common::Server; #[actix_rt::test] @@ -23,3 +25,16 @@ async fn delete_unexisting_index() { assert_eq!(code, 404); } + +#[actix_rt::test] +async fn loop_delete_add_documents() { + let server = Server::new().await; + let index = server.index("test"); + let documents = json!([{"id": 1, "field1": "hello"}]); + for _ in 0..50 { + let (response, code) = index.add_documents(documents.clone(), None).await; + assert_eq!(code, 202, "{}", response); + let (response, code) = index.delete().await; + assert_eq!(code, 204, "{}", response); + } +}