1783: Fix too many open file error r=ManyTheFish a=ManyTheFish

- prepare_for_closing() function wasn't called when an index is deleted, we are now calling it
- Index wasn't deleted in the case where we couldn't insert `uid` in `index_uuid_store`, we are now cleaning it

Fix #1736

Co-authored-by: many <maxime@meilisearch.com>
This commit is contained in:
bors[bot] 2021-10-07 15:48:07 +00:00 committed by GitHub
commit dffd90b966
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -6,6 +6,7 @@ use std::path::Path;
use error::{IndexResolverError, Result}; use error::{IndexResolverError, Result};
use index_store::{IndexStore, MapIndexStore}; use index_store::{IndexStore, MapIndexStore};
use log::error;
use uuid::Uuid; use uuid::Uuid;
use uuid_store::{HeedUuidStore, UuidStore}; use uuid_store::{HeedUuidStore, UuidStore};
@ -98,8 +99,19 @@ where
} }
let uuid = Uuid::new_v4(); let uuid = Uuid::new_v4();
let index = self.index_store.create(uuid, primary_key).await?; let index = self.index_store.create(uuid, primary_key).await?;
self.index_uuid_store.insert(uid, uuid).await?; match self.index_uuid_store.insert(uid, uuid).await {
Ok(index) Err(e) => {
match self.index_store.delete(uuid).await {
Ok(Some(index)) => {
index.inner().clone().prepare_for_closing();
}
Ok(None) => (),
Err(e) => error!("Error while deleting index: {:?}", e),
}
Err(e)
}
Ok(()) => Ok(index),
}
} }
pub async fn list(&self) -> Result<Vec<(String, Index)>> { pub async fn list(&self) -> Result<Vec<(String, Index)>> {
@ -121,7 +133,13 @@ where
pub async fn delete_index(&self, uid: String) -> Result<Uuid> { pub async fn delete_index(&self, uid: String) -> Result<Uuid> {
match self.index_uuid_store.delete(uid.clone()).await? { match self.index_uuid_store.delete(uid.clone()).await? {
Some(uuid) => { Some(uuid) => {
let _ = self.index_store.delete(uuid).await; match self.index_store.delete(uuid).await {
Ok(Some(index)) => {
index.inner().clone().prepare_for_closing();
}
Ok(None) => (),
Err(e) => error!("Error while deleting index: {:?}", e),
}
Ok(uuid) Ok(uuid)
} }
None => Err(IndexResolverError::UnexistingIndex(uid)), None => Err(IndexResolverError::UnexistingIndex(uid)),