This is an automated email from the ASF dual-hosted git repository. meteorgan pushed a commit to branch azblob_write_returns_metadata in repository https://gitbox.apache.org/repos/asf/opendal.git
commit be183fe8f138fab7199236663cc4c34828f02116 Author: meteorgan <[email protected]> AuthorDate: Sat Apr 5 17:58:22 2025 +0800 feat(services/azblob): implement write returns metadata --- core/src/services/azblob/backend.rs | 4 ++++ core/src/services/azblob/core.rs | 4 ++++ core/src/services/azblob/writer.rs | 32 +++++++++++++++++++++++++++++--- 3 files changed, 37 insertions(+), 3 deletions(-) diff --git a/core/src/services/azblob/backend.rs b/core/src/services/azblob/backend.rs index eafe32ddb..db942633b 100644 --- a/core/src/services/azblob/backend.rs +++ b/core/src/services/azblob/backend.rs @@ -39,6 +39,7 @@ use super::lister::AzblobLister; use super::writer::AzblobWriter; use super::writer::AzblobWriters; use crate::raw::*; +use crate::services::core::constants::X_MS_VERSION_ID; use crate::services::AzblobConfig; use crate::*; @@ -567,6 +568,9 @@ impl Access for AzblobBackend { StatusCode::OK => { let headers = resp.headers(); let mut meta = parse_into_metadata(path, headers)?; + if let Some(version_id) = parse_header_to_str(headers, X_MS_VERSION_ID)? { + meta.set_version(version_id); + } let user_meta = parse_prefixed_headers(headers, X_MS_META_PREFIX); if !user_meta.is_empty() { diff --git a/core/src/services/azblob/core.rs b/core/src/services/azblob/core.rs index 87fd4da11..7f664e64b 100644 --- a/core/src/services/azblob/core.rs +++ b/core/src/services/azblob/core.rs @@ -47,6 +47,7 @@ use crate::raw::*; use crate::*; pub mod constants { + // Indicates the Blob Storage version that was used to execute the request pub const X_MS_VERSION: &str = "x-ms-version"; pub const X_MS_BLOB_TYPE: &str = "x-ms-blob-type"; @@ -55,6 +56,9 @@ pub mod constants { pub const X_MS_BLOB_CONDITION_APPENDPOS: &str = "x-ms-blob-condition-appendpos"; pub const X_MS_META_PREFIX: &str = "x-ms-meta-"; + // indicates the version of the blob, and it can be used in subsequent requests to access the blob. + pub const X_MS_VERSION_ID: &str = "x-ms-version-id"; + // Server-side encryption with customer-provided headers pub const X_MS_ENCRYPTION_KEY: &str = "x-ms-encryption-key"; pub const X_MS_ENCRYPTION_KEY_SHA256: &str = "x-ms-encryption-key-sha256"; diff --git a/core/src/services/azblob/writer.rs b/core/src/services/azblob/writer.rs index 17cf8b676..1216d5b8b 100644 --- a/core/src/services/azblob/writer.rs +++ b/core/src/services/azblob/writer.rs @@ -23,6 +23,7 @@ use uuid::Uuid; use super::core::AzblobCore; use super::error::parse_error; use crate::raw::*; +use crate::services::core::constants::X_MS_VERSION_ID; use crate::*; const X_MS_BLOB_TYPE: &str = "x-ms-blob-type"; @@ -40,6 +41,28 @@ impl AzblobWriter { pub fn new(core: Arc<AzblobCore>, op: OpWrite, path: String) -> Self { AzblobWriter { core, op, path } } + + fn parse_metadata(headers: &http::HeaderMap) -> Result<Metadata> { + let mut metadata = Metadata::default(); + + if let Some(last_modified) = parse_last_modified(headers)? { + metadata.set_last_modified(last_modified); + } + let etag = parse_etag(headers)?; + if let Some(etag) = etag { + metadata.set_etag(etag); + } + let md5 = parse_content_md5(headers)?; + if let Some(md5) = md5 { + metadata.set_content_md5(md5); + } + let version_id = parse_header_to_str(headers, X_MS_VERSION_ID)?; + if let Some(version_id) = version_id { + metadata.set_version(version_id); + } + + Ok(metadata) + } } impl oio::AppendWrite for AzblobWriter { @@ -97,9 +120,10 @@ impl oio::AppendWrite for AzblobWriter { let resp = self.core.send(req).await?; + let meta = AzblobWriter::parse_metadata(resp.headers())?; let status = resp.status(); match status { - StatusCode::CREATED => Ok(Metadata::default()), + StatusCode::CREATED => Ok(meta), _ => Err(parse_error(resp)), } } @@ -116,8 +140,9 @@ impl oio::BlockWrite for AzblobWriter { let status = resp.status(); + let meta = AzblobWriter::parse_metadata(resp.headers())?; match status { - StatusCode::CREATED | StatusCode::OK => Ok(Metadata::default()), + StatusCode::CREATED | StatusCode::OK => Ok(meta), _ => Err(parse_error(resp)), } } @@ -141,9 +166,10 @@ impl oio::BlockWrite for AzblobWriter { .azblob_complete_put_block_list(&self.path, block_ids, &self.op) .await?; + let meta = AzblobWriter::parse_metadata(resp.headers())?; let status = resp.status(); match status { - StatusCode::CREATED | StatusCode::OK => Ok(Metadata::default()), + StatusCode::CREATED | StatusCode::OK => Ok(meta), _ => Err(parse_error(resp)), } }
