This is an automated email from the ASF dual-hosted git repository. xuanwo pushed a commit to branch polish-gdrive in repository https://gitbox.apache.org/repos/asf/incubator-opendal.git
commit 2674208a65db4add16460c8eff18dbe3f4220f60 Author: Xuanwo <[email protected]> AuthorDate: Sat Oct 7 16:39:48 2023 +0800 refactor(services/gdrive): Use moka instead of Arc<Mutex<HashMap>> Signed-off-by: Xuanwo <[email protected]> --- core/src/services/gdrive/backend.rs | 22 ++++-------------- core/src/services/gdrive/core.rs | 46 ++++++++++++++++++++++--------------- 2 files changed, 33 insertions(+), 35 deletions(-) diff --git a/core/src/services/gdrive/backend.rs b/core/src/services/gdrive/backend.rs index 1cccca607..ad0a4ba58 100644 --- a/core/src/services/gdrive/backend.rs +++ b/core/src/services/gdrive/backend.rs @@ -104,11 +104,7 @@ impl Accessor for GdriveBackend { .map_err(new_json_deserialize_error)?; if !meta.files.is_empty() { - self.core.path_cache.insert( - build_abs_path(&self.core.root, path), - meta.files[0].id.clone(), - ); - + self.core.cache_insert(path, &meta.files[0].id); return Ok(RpCreateDir::default()); } } @@ -125,9 +121,7 @@ impl Accessor for GdriveBackend { let meta = serde_json::from_slice::<GdriveFile>(&body) .map_err(new_json_deserialize_error)?; - self.core - .path_cache - .insert(build_abs_path(&self.core.root, path), meta.id.clone()); + self.core.cache_insert(path, &meta.id); Ok(RpCreateDir::default()) } @@ -205,12 +199,8 @@ impl Accessor for GdriveBackend { let meta = serde_json::from_slice::<GdriveFile>(&body) .map_err(new_json_deserialize_error)?; - self.core - .path_cache - .invalidate(&build_abs_path(&self.core.root, from)); - self.core - .path_cache - .insert(build_abs_path(&self.core.root, to), meta.id.clone()); + self.core.cache_remove(from); + self.core.cache_insert(to, &meta.id); Ok(RpRename::default()) } @@ -225,9 +215,7 @@ impl Accessor for GdriveBackend { match status { StatusCode::NO_CONTENT => { - self.core - .path_cache - .invalidate(&build_abs_path(&self.core.root, path)); + self.core.cache_remove(path); return Ok(RpDelete::default()); } diff --git a/core/src/services/gdrive/core.rs b/core/src/services/gdrive/core.rs index 785895a41..d68d36344 100644 --- a/core/src/services/gdrive/core.rs +++ b/core/src/services/gdrive/core.rs @@ -67,6 +67,26 @@ impl Debug for GdriveCore { } impl GdriveCore { + #[inline] + pub fn cache_get(&self, path: &str) -> Option<String> { + let path = build_abs_path(&self.root, path); + self.path_cache.get(&path) + } + + /// Insert the path and file id into the cache. + #[inline] + pub fn cache_insert(&self, path: &str, id: &str) { + let path = build_abs_path(&self.root, path); + self.path_cache.insert(path.to_string(), id.to_string()); + } + + /// Remove the cache for path. + #[inline] + pub fn cache_remove(&self, path: &str) { + let path = build_abs_path(&self.root, path); + self.path_cache.invalidate(&path); + } + /// Get the file id by path. /// Including file and folder. /// @@ -77,12 +97,8 @@ impl GdriveCore { /// - A path is a sequence of file names separated by slashes. /// - A file only knows its parent id, but not its name. /// - To find the file id of a file, we need to traverse the path from the root to the file. - pub(crate) async fn get_file_id_by_path(&self, file_path: &str) -> Result<String> { - let path = build_abs_path(&self.root, file_path); - - let cache = &self.path_cache; - - if let Some(id) = cache.get(&path) { + pub(crate) async fn get_file_id_by_path(&self, path: &str) -> Result<String> { + if let Some(id) = self.cache_get(path) { return Ok(id.to_owned()); } @@ -91,7 +107,7 @@ impl GdriveCore { for (i, item) in file_path_items.iter().enumerate() { let path_part = file_path_items[0..=i].join("/"); - if let Some(id) = cache.get(&path_part) { + if let Some(id) = self.cache_get(&path_part) { parent_id = id.to_owned(); continue; } @@ -136,7 +152,7 @@ impl GdriveCore { parent_id = gdrive_file_list.files[0].id.clone(); - cache.insert(path_part, parent_id.clone()); + self.cache_insert(&path_part, &parent_id); } _ => { return Err(parse_error(resp).await?); @@ -155,17 +171,13 @@ impl GdriveCore { /// - The path is rooted at the root of the Google Drive. /// - Will create the parent path recursively. pub(crate) async fn ensure_parent_path(&self, path: &str) -> Result<String> { - let path = build_abs_path(&self.root, path); - let mut parent: String = "root".to_owned(); let mut file_path_items: Vec<&str> = path.split('/').filter(|&x| !x.is_empty()).collect(); file_path_items.pop(); - let cache = &self.path_cache; - for (i, item) in file_path_items.iter().enumerate() { let path_part = file_path_items[0..=i].join("/"); - if let Some(id) = cache.get(&path_part) { + if let Some(id) = self.cache_get(&path_part) { parent = id.to_owned(); continue; } @@ -209,7 +221,7 @@ impl GdriveCore { parent = gdrive_file_list.files[0].id.clone(); } - cache.insert(path_part, parent.clone()); + self.cache_insert(&path_part, &parent); } StatusCode::NOT_FOUND => { let parent_name = file_path_items[i]; @@ -224,7 +236,7 @@ impl GdriveCore { let parent_id = res.into_body().bytes().await?; parent = String::from_utf8_lossy(&parent_id).to_string(); - cache.insert(path_part, parent.clone()); + self.cache_insert(&path_part, &parent); } _ => { return Err(parse_error(res).await?); @@ -406,8 +418,6 @@ impl GdriveCore { .collect(); source_parent.pop(); - let cache = &self.path_cache; - let file_name = build_abs_path(&self.root, target) .split('/') .filter(|&x| !x.is_empty()) @@ -417,7 +427,7 @@ impl GdriveCore { let metadata = &json!({ "name": file_name, - "removeParents": [cache.get(&source_parent.join("/")).unwrap().to_string()], + "removeParents": [self.cache_get(&source_parent.join("/")).unwrap().to_string()], "addParents": [parent], });
