implement create index

This commit is contained in:
mpostma 2021-02-03 20:12:48 +01:00
parent d43dc4824c
commit f988306691
No known key found for this signature in database
GPG Key ID: CBC8A7C1D7A28C3A
2 changed files with 32 additions and 6 deletions

View File

@ -2,6 +2,7 @@ use std::fs::{create_dir_all, remove_dir_all};
use std::path::{Path, PathBuf}; use std::path::{Path, PathBuf};
use std::sync::Arc; use std::sync::Arc;
use anyhow::bail;
use chrono::{DateTime, Utc}; use chrono::{DateTime, Utc};
use dashmap::{DashMap, mapref::entry::Entry}; use dashmap::{DashMap, mapref::entry::Entry};
use heed::{Env, EnvOpenOptions, Database, types::{Str, SerdeJson, ByteSlice}, RoTxn, RwTxn}; use heed::{Env, EnvOpenOptions, Database, types::{Str, SerdeJson, ByteSlice}, RoTxn, RwTxn};
@ -141,7 +142,7 @@ impl IndexStore {
Some(res) => Ok(res), Some(res) => Ok(res),
None => { None => {
let uuid = Uuid::new_v4(); let uuid = Uuid::new_v4();
let result = self.create_index(&mut txn, uuid, name, update_size, index_size)?; let result = self.create_index_txn(&mut txn, uuid, name, update_size, index_size)?;
// If we fail to commit the transaction, we must delete the database from the // If we fail to commit the transaction, we must delete the database from the
// file-system. // file-system.
if let Err(e) = txn.commit() { if let Err(e) = txn.commit() {
@ -164,7 +165,7 @@ impl IndexStore {
self.uuid_to_index.remove(&uuid); self.uuid_to_index.remove(&uuid);
} }
fn create_index( &self, fn create_index_txn( &self,
txn: &mut RwTxn, txn: &mut RwTxn,
uuid: Uuid, uuid: Uuid,
name: impl AsRef<str>, name: impl AsRef<str>,
@ -191,6 +192,30 @@ impl IndexStore {
Ok((index, update_store)) Ok((index, update_store))
} }
/// Same a get or create, but returns an error if the index already exists.
pub fn create_index(
&self,
name: impl AsRef<str>,
update_size: u64,
index_size: u64,
) -> anyhow::Result<(Arc<Index>, Arc<UpdateStore>)> {
let uuid = Uuid::new_v4();
let mut txn = self.env.write_txn()?;
if self.name_to_uuid_db.get(&txn, name.as_ref())?.is_some() {
bail!("cannot create index {:?}: an index with this name already exists.")
}
let result = self.create_index_txn(&mut txn, uuid, name, update_size, index_size)?;
// If we fail to commit the transaction, we must delete the database from the
// file-system.
if let Err(e) = txn.commit() {
self.clean_db(uuid);
return Err(e)?;
}
Ok(result)
}
/// Returns each index associated with it's metadata; /// Returns each index associated with it's metadata;
pub fn list_indexes(&self) -> anyhow::Result<Vec<(String, IndexMeta)>> { pub fn list_indexes(&self) -> anyhow::Result<Vec<(String, IndexMeta)>> {
let txn = self.env.read_txn()?; let txn = self.env.read_txn()?;
@ -362,8 +387,8 @@ mod test {
let index_size = 4096 * 100; let index_size = 4096 * 100;
let uuid = Uuid::new_v4(); let uuid = Uuid::new_v4();
let mut txn = store.env.write_txn().unwrap(); let mut txn = store.env.write_txn().unwrap();
store.create_index(&mut txn, uuid, name, update_size, index_size).unwrap(); store.create_index_txn(&mut txn, uuid, name, update_size, index_size).unwrap();
let uuid = store.name_to_uuid_meta.get(&txn, &name).unwrap(); let uuid = store.name_to_uuid.get(&txn, &name).unwrap();
assert_eq!(store.uuid_to_index.len(), 1); assert_eq!(store.uuid_to_index.len(), 1);
assert!(uuid.is_some()); assert!(uuid.is_some());
let uuid = Uuid::from_slice(uuid.unwrap()).unwrap(); let uuid = Uuid::from_slice(uuid.unwrap()).unwrap();

View File

@ -58,8 +58,9 @@ impl IndexController for LocalIndexController {
Ok(pending.into()) Ok(pending.into())
} }
fn create_index<S: AsRef<str>>(&self, _index_uid: S) -> anyhow::Result<()> { fn create_index<S: AsRef<str>>(&self, index_uid: S) -> anyhow::Result<()> {
todo!() self.indexes.create_index(index_uid, self.update_db_size, self.index_db_size)?;
Ok(())
} }
fn delete_index<S: AsRef<str>>(&self, _index_uid: S) -> anyhow::Result<()> { fn delete_index<S: AsRef<str>>(&self, _index_uid: S) -> anyhow::Result<()> {