lock concurrent fetch_or_creates to prevent inconsistencies
This commit is contained in:
parent
dacfc57d11
commit
cb832b6789
1 changed files with 13 additions and 4 deletions
|
@ -145,6 +145,10 @@ pub async fn list_node<C: Connection<Backend = Sqlite>>(
|
||||||
.collect::<Vec<Entry>>())
|
.collect::<Vec<Entry>>())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
lazy_static! {
|
||||||
|
static ref FETCH_CREATE_LOCK: Mutex<()> = Mutex::new(());
|
||||||
|
}
|
||||||
|
|
||||||
pub fn fetch_or_create_dir<C: Connection<Backend = Sqlite>>(
|
pub fn fetch_or_create_dir<C: Connection<Backend = Sqlite>>(
|
||||||
connection: &C,
|
connection: &C,
|
||||||
parent: Option<Address>,
|
parent: Option<Address>,
|
||||||
|
@ -156,6 +160,11 @@ pub fn fetch_or_create_dir<C: Connection<Backend = Sqlite>>(
|
||||||
None => trace!("FETCHING/CREATING /{:#}", directory),
|
None => trace!("FETCHING/CREATING /{:#}", directory),
|
||||||
}
|
}
|
||||||
|
|
||||||
|
let _lock;
|
||||||
|
if create {
|
||||||
|
_lock = FETCH_CREATE_LOCK.lock().unwrap();
|
||||||
|
}
|
||||||
|
|
||||||
let matching_directories = query(
|
let matching_directories = query(
|
||||||
connection,
|
connection,
|
||||||
Query::SingleQuery(QueryPart::Matches(EntryQuery {
|
Query::SingleQuery(QueryPart::Matches(EntryQuery {
|
||||||
|
@ -220,8 +229,9 @@ pub fn fetch_or_create_dir<C: Connection<Backend = Sqlite>>(
|
||||||
}
|
}
|
||||||
1 => Ok(valid_directories[0].clone()),
|
1 => Ok(valid_directories[0].clone()),
|
||||||
_ => Err(anyhow!(format!(
|
_ => Err(anyhow!(format!(
|
||||||
"Invalid database state - more than one directory matches the query {:?}/{:#}!", parent, directory)
|
"Invalid database state - more than one directory matches the query {:?}/{:#}!",
|
||||||
)),
|
parent, directory
|
||||||
|
))),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -269,8 +279,7 @@ pub fn resolve_path_cached<C: Connection<Backend = Sqlite>>(
|
||||||
result.push(address.clone());
|
result.push(address.clone());
|
||||||
} else {
|
} else {
|
||||||
drop(cache_lock);
|
drop(cache_lock);
|
||||||
let address =
|
let address = fetch_or_create_dir(connection, parent, node, create)?;
|
||||||
fetch_or_create_dir(connection, parent, node, create)?;
|
|
||||||
result.push(address.clone());
|
result.push(address.clone());
|
||||||
cache.lock().unwrap().put(key, address);
|
cache.lock().unwrap().put(key, address);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue