From f10a7482c5fb132f9e11c9942da215cb4e6c2170 Mon Sep 17 00:00:00 2001 From: Xuanwo Date: Sun, 23 Jul 2023 16:29:53 +0800 Subject: [PATCH 1/3] refactor(services/s3): Check header first for region detect Signed-off-by: Xuanwo --- core/src/services/s3/backend.rs | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/core/src/services/s3/backend.rs b/core/src/services/s3/backend.rs index 2a12a2b29ba0..096ee0bb6113 100644 --- a/core/src/services/s3/backend.rs +++ b/core/src/services/s3/backend.rs @@ -626,19 +626,19 @@ impl S3Builder { res.headers() ); - match res.status() { - StatusCode::OK | StatusCode::MOVED_PERMANENTLY => { - let region = res.headers().get("x-amz-bucket-region")?; - if let Ok(regin) = region.to_str() { - Some(regin.to_string()) - } else { - None - } - } - StatusCode::FORBIDDEN => Some("us-east-1".to_string()), - // Unexpected status code - _ => None, + // Get region from response header no matter status code. + let region = res.headers().get("x-amz-bucket-region")?; + if let Ok(regin) = region.to_str() { + return Some(regin.to_string()); } + + // Status code is 403 or 200 means we already visit the correct + // region, we can use the default region direcly. + if res.status() == StatusCode::FORBIDDEN || res.status() == StatusCode::OK { + return Some("us-east-1".to_string()); + } + + None } } From ba16c9cda5f75dc185ef330103b7e07d98248777 Mon Sep 17 00:00:00 2001 From: Xuanwo Date: Sun, 23 Jul 2023 16:33:10 +0800 Subject: [PATCH 2/3] Fix typo Signed-off-by: Xuanwo --- core/src/services/s3/backend.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/src/services/s3/backend.rs b/core/src/services/s3/backend.rs index 096ee0bb6113..e504b2b61a0a 100644 --- a/core/src/services/s3/backend.rs +++ b/core/src/services/s3/backend.rs @@ -633,7 +633,7 @@ impl S3Builder { } // Status code is 403 or 200 means we already visit the correct - // region, we can use the default region direcly. + // region, we can use the default region directly. if res.status() == StatusCode::FORBIDDEN || res.status() == StatusCode::OK { return Some("us-east-1".to_string()); } From 34b69161d4da9c6bd52f029ab5baaad79a80f201 Mon Sep 17 00:00:00 2001 From: Xuanwo Date: Sun, 23 Jul 2023 16:43:19 +0800 Subject: [PATCH 3/3] Polish API Signed-off-by: Xuanwo --- bin/oay/src/bin/webdav.rs | 2 -- bin/oay/src/services/webdav/service.rs | 3 +-- bin/oay/src/services/webdav/webdav_file.rs | 9 +++++---- bin/oay/src/services/webdav/webdavfs.rs | 7 +++++-- core/src/services/etcd/backend.rs | 4 +++- core/src/services/obs/backend.rs | 2 +- core/src/services/s3/backend.rs | 11 +++-------- 7 files changed, 18 insertions(+), 20 deletions(-) diff --git a/bin/oay/src/bin/webdav.rs b/bin/oay/src/bin/webdav.rs index 3250dffcba79..acaf9161b5e7 100644 --- a/bin/oay/src/bin/webdav.rs +++ b/bin/oay/src/bin/webdav.rs @@ -18,11 +18,9 @@ use std::sync::Arc; use anyhow::Result; - use oay::services::WebdavService; use oay::Config; use opendal::services::Fs; - use opendal::Operator; use tracing_subscriber::fmt; use tracing_subscriber::prelude::*; diff --git a/bin/oay/src/services/webdav/service.rs b/bin/oay/src/services/webdav/service.rs index dc3045f9683f..6a1bcf55269b 100644 --- a/bin/oay/src/services/webdav/service.rs +++ b/bin/oay/src/services/webdav/service.rs @@ -25,9 +25,8 @@ use axum::Router; use dav_server::DavHandler; use opendal::Operator; -use crate::Config; - use super::webdavfs::WebdavFs; +use crate::Config; pub struct WebdavService { cfg: Arc, diff --git a/bin/oay/src/services/webdav/webdav_file.rs b/bin/oay/src/services/webdav/webdav_file.rs index ed9ac1ba6507..5128c246d990 100644 --- a/bin/oay/src/services/webdav/webdav_file.rs +++ b/bin/oay/src/services/webdav/webdav_file.rs @@ -17,10 +17,11 @@ use std::io::SeekFrom; -use dav_server::{ - davpath::DavPath, - fs::{DavFile, DavMetaData, FsFuture, OpenOptions}, -}; +use dav_server::davpath::DavPath; +use dav_server::fs::DavFile; +use dav_server::fs::DavMetaData; +use dav_server::fs::FsFuture; +use dav_server::fs::OpenOptions; use futures::FutureExt; use opendal::Operator; diff --git a/bin/oay/src/services/webdav/webdavfs.rs b/bin/oay/src/services/webdav/webdavfs.rs index 7c5709aaff99..22f51df97506 100644 --- a/bin/oay/src/services/webdav/webdavfs.rs +++ b/bin/oay/src/services/webdav/webdavfs.rs @@ -15,11 +15,14 @@ // specific language governing permissions and limitations // under the License. -use dav_server::fs::{DavFile, DavFileSystem, DavMetaData}; +use dav_server::fs::DavFile; +use dav_server::fs::DavFileSystem; +use dav_server::fs::DavMetaData; use futures::FutureExt; use opendal::Operator; -use super::{webdav_file::WebdavFile, webdav_metadata::WebdavMetaData}; +use super::webdav_file::WebdavFile; +use super::webdav_metadata::WebdavMetaData; #[derive(Clone)] pub struct WebdavFs { diff --git a/core/src/services/etcd/backend.rs b/core/src/services/etcd/backend.rs index 035e9a58bd21..0181aeaa507a 100644 --- a/core/src/services/etcd/backend.rs +++ b/core/src/services/etcd/backend.rs @@ -21,10 +21,12 @@ use std::fmt::Formatter; use async_trait::async_trait; use etcd_client::Certificate; +use etcd_client::Client; +use etcd_client::ConnectOptions; use etcd_client::Error as EtcdError; +use etcd_client::GetOptions; use etcd_client::Identity; use etcd_client::TlsOptions; -use etcd_client::{Client, ConnectOptions, GetOptions}; use tokio::sync::OnceCell; use crate::raw::adapters::kv; diff --git a/core/src/services/obs/backend.rs b/core/src/services/obs/backend.rs index cd7811abd957..aeb7b5bcdb4c 100644 --- a/core/src/services/obs/backend.rs +++ b/core/src/services/obs/backend.rs @@ -91,7 +91,7 @@ use crate::*; /// /// Ok(()) /// } -///``` +/// ``` const DEFAULT_WRITE_MIN_SIZE: usize = 100 * 1024; diff --git a/core/src/services/s3/backend.rs b/core/src/services/s3/backend.rs index e504b2b61a0a..8a2d46fc9095 100644 --- a/core/src/services/s3/backend.rs +++ b/core/src/services/s3/backend.rs @@ -556,17 +556,14 @@ impl S3Builder { /// use opendal::services::S3; /// /// # async fn example() { - /// let builder = S3::default(); - /// let region: Option = builder - /// .detect_region("https://s3.amazonaws.com", "example") - /// .await; + /// let region: Option = S3::detect_region("https://s3.amazonaws.com", "example").await; /// # } /// ``` /// /// # Reference /// /// - [Amazon S3 HeadBucket API](https://docs.aws.amazon.com/zh_cn/AmazonS3/latest/API/API_HeadBucket.html) - pub async fn detect_region(&self, endpoint: &str, bucket: &str) -> Option { + pub async fn detect_region(endpoint: &str, bucket: &str) -> Option { let mut endpoint = if endpoint.starts_with("http") { endpoint.to_string() } else { @@ -1249,10 +1246,8 @@ mod tests { ), ]; - let b = S3Builder::default(); - for (name, endpoint, bucket, expected) in cases { - let region = b.detect_region(endpoint, bucket).await; + let region = S3Builder::detect_region(endpoint, bucket).await; assert_eq!(region.as_deref(), expected, "{}", name); } }