diff --git a/index-scheduler/src/batch.rs b/index-scheduler/src/batch.rs index 5100254fd..78f1e1fbe 100644 --- a/index-scheduler/src/batch.rs +++ b/index-scheduler/src/batch.rs @@ -788,7 +788,7 @@ impl IndexScheduler { let index = if must_create_index { // create the index if it doesn't already exist let wtxn = self.env.write_txn()?; - self.index_mapper.create_index(wtxn, index_uid)? + self.index_mapper.create_index(wtxn, index_uid, None)? } else { let rtxn = self.env.read_txn()?; self.index_mapper.index(&rtxn, index_uid)? @@ -805,7 +805,7 @@ impl IndexScheduler { if self.index_mapper.exists(&wtxn, &index_uid)? { return Err(Error::IndexAlreadyExists(index_uid)); } - self.index_mapper.create_index(wtxn, &index_uid)?; + self.index_mapper.create_index(wtxn, &index_uid, None)?; self.process_batch(Batch::IndexUpdate { index_uid, primary_key, task }) } diff --git a/index-scheduler/src/index_mapper.rs b/index-scheduler/src/index_mapper.rs index c65d76837..02b53749f 100644 --- a/index-scheduler/src/index_mapper.rs +++ b/index-scheduler/src/index_mapper.rs @@ -9,6 +9,7 @@ use meilisearch_types::heed::types::Str; use meilisearch_types::heed::{Database, Env, EnvOpenOptions, RoTxn, RwTxn}; use meilisearch_types::milli::update::IndexerConfig; use meilisearch_types::milli::Index; +use time::OffsetDateTime; use uuid::Uuid; use self::IndexStatus::{Available, BeingDeleted}; @@ -66,15 +67,29 @@ impl IndexMapper { /// Create or open an index in the specified path. /// The path *must* exists or an error will be thrown. - fn create_or_open_index(&self, path: &Path) -> Result { + fn create_or_open_index( + &self, + path: &Path, + date: Option<(OffsetDateTime, OffsetDateTime)>, + ) -> Result { let mut options = EnvOpenOptions::new(); options.map_size(clamp_to_page_size(self.index_size)); options.max_readers(1024); - Ok(Index::new(options, path)?) + + if let Some((created, updated)) = date { + Ok(Index::new_with_creation_dates(options, path, created, updated)?) + } else { + Ok(Index::new(options, path)?) + } } /// Get or create the index. - pub fn create_index(&self, mut wtxn: RwTxn, name: &str) -> Result { + pub fn create_index( + &self, + mut wtxn: RwTxn, + name: &str, + date: Option<(OffsetDateTime, OffsetDateTime)>, + ) -> Result { match self.index(&wtxn, name) { Ok(index) => { wtxn.commit()?; @@ -86,7 +101,8 @@ impl IndexMapper { let index_path = self.base_path.join(uuid.to_string()); fs::create_dir_all(&index_path)?; - let index = self.create_or_open_index(&index_path)?; + + let index = self.create_or_open_index(&index_path, date)?; wtxn.commit()?; // TODO: it would be better to lazily create the index. But we need an Index::open function for milli. @@ -179,7 +195,8 @@ impl IndexMapper { match index_map.entry(uuid) { Entry::Vacant(entry) => { let index_path = self.base_path.join(uuid.to_string()); - let index = self.create_or_open_index(&index_path)?; + + let index = self.create_or_open_index(&index_path, None)?; entry.insert(Available(index.clone())); index } diff --git a/index-scheduler/src/lib.rs b/index-scheduler/src/lib.rs index a0d87902c..c9d5f2ec9 100644 --- a/index-scheduler/src/lib.rs +++ b/index-scheduler/src/lib.rs @@ -693,7 +693,7 @@ impl IndexScheduler { let mut task = Task { uid: self.next_task_id(&wtxn)?, - enqueued_at: time::OffsetDateTime::now_utc(), + enqueued_at: OffsetDateTime::now_utc(), started_at: None, finished_at: None, error: None, @@ -865,10 +865,13 @@ impl IndexScheduler { } /// Create a new index without any associated task. - pub fn create_raw_index(&self, name: &str) -> Result { + pub fn create_raw_index( + &self, + name: &str, + date: Option<(OffsetDateTime, OffsetDateTime)>, + ) -> Result { let wtxn = self.env.write_txn()?; - let index = self.index_mapper.create_index(wtxn, name)?; - + let index = self.index_mapper.create_index(wtxn, name, date)?; Ok(index) } diff --git a/meilisearch/src/lib.rs b/meilisearch/src/lib.rs index 6d18942a4..3797a3a44 100644 --- a/meilisearch/src/lib.rs +++ b/meilisearch/src/lib.rs @@ -289,7 +289,9 @@ fn import_dump( let mut index_reader = index_reader?; let metadata = index_reader.metadata(); log::info!("Importing index `{}`.", metadata.uid); - let index = index_scheduler.create_raw_index(&metadata.uid)?; + + let date = Some((metadata.created_at, metadata.updated_at)); + let index = index_scheduler.create_raw_index(&metadata.uid, date)?; let mut wtxn = index.write_txn()?;