From f91ab5c8ac59bc26ff5095ee34ab759e4884ace0 Mon Sep 17 00:00:00 2001 From: Wenbin1002 Date: Wed, 1 Jan 2025 17:38:32 +0800 Subject: [PATCH] add is_current for metadata (cherry picked from commit 39bb79d34a6699359cfbda3c9ce0a4ac2aa0d539) --- core/src/services/oss/backend.rs | 3 +++ core/src/services/oss/lister.rs | 1 + core/src/services/s3/backend.rs | 3 +++ core/src/services/s3/lister.rs | 3 ++- core/src/types/metadata.rs | 23 +++++++++++++++++++++++ 5 files changed, 32 insertions(+), 1 deletion(-) diff --git a/core/src/services/oss/backend.rs b/core/src/services/oss/backend.rs index 0ec56cdc2acd..f3bf93553bf7 100644 --- a/core/src/services/oss/backend.rs +++ b/core/src/services/oss/backend.rs @@ -521,8 +521,11 @@ impl Access for OssBackend { let headers = resp.headers(); let mut meta = self.core.parse_metadata(path, resp.headers())?; + // If version id exists, set the version; otherwise, mark as the current version. if let Some(v) = parse_header_to_str(headers, "x-oss-version-id")? { meta.set_version(v); + } else { + meta.set_is_current(true); } Ok(RpStat::new(meta)) diff --git a/core/src/services/oss/lister.rs b/core/src/services/oss/lister.rs index a130ea201b56..e69096e50db2 100644 --- a/core/src/services/oss/lister.rs +++ b/core/src/services/oss/lister.rs @@ -102,6 +102,7 @@ impl oio::PageList for OssLister { } let mut meta = Metadata::new(EntryMode::from_path(&path)); + meta.set_is_current(true); meta.set_etag(&object.etag); meta.set_content_md5(object.etag.trim_matches('"')); meta.set_content_length(object.size); diff --git a/core/src/services/s3/backend.rs b/core/src/services/s3/backend.rs index 2d8ba50588e3..a8a5f4c7a87b 100644 --- a/core/src/services/s3/backend.rs +++ b/core/src/services/s3/backend.rs @@ -1016,8 +1016,11 @@ impl Access for S3Backend { meta.with_user_metadata(user_meta); } + // If version id exists, set the version; otherwise, mark as the current version. if let Some(v) = parse_header_to_str(headers, "x-amz-version-id")? { meta.set_version(v); + } else { + meta.set_is_current(true); } Ok(RpStat::new(meta)) diff --git a/core/src/services/s3/lister.rs b/core/src/services/s3/lister.rs index 9063e610448d..fb27f23ee5bc 100644 --- a/core/src/services/s3/lister.rs +++ b/core/src/services/s3/lister.rs @@ -124,7 +124,7 @@ impl oio::PageList for S3Lister { } let mut meta = Metadata::new(EntryMode::from_path(&path)); - + meta.set_is_current(true); if let Some(etag) = &object.etag { meta.set_etag(etag); meta.set_content_md5(etag.trim_matches('"')); @@ -239,6 +239,7 @@ impl oio::PageList for S3ObjectVersionsLister { let mut meta = Metadata::new(EntryMode::from_path(&path)); meta.set_version(&version_object.version_id); + meta.set_is_current(version_object.is_latest); meta.set_content_length(version_object.size); meta.set_last_modified(parse_datetime_from_rfc3339( version_object.last_modified.as_str(), diff --git a/core/src/types/metadata.rs b/core/src/types/metadata.rs index c1d4155e1971..957f5072a6a3 100644 --- a/core/src/types/metadata.rs +++ b/core/src/types/metadata.rs @@ -43,6 +43,7 @@ pub struct Metadata { etag: Option, last_modified: Option>, version: Option, + is_current: Option, user_metadata: Option>, } @@ -64,6 +65,7 @@ impl Metadata { content_disposition: None, version: None, user_metadata: None, + is_current: None, } } @@ -404,6 +406,27 @@ impl Metadata { self } + /// Is_current of this entry. + /// + /// Is_current is a boolean that can be used to identify + /// if the version of this entry is the latest version. + pub fn is_current(&self) -> Option { + self.is_current + } + + /// Set is_current of this entry. + /// + /// For HeadObject without version_id, we will set it to Some(true). + /// + /// For HeadObject with version_id, we will set it to None. + /// + /// For ListObjects, we will set all keys to Some(ture) + /// + /// For ListObjectVersions, we will decide the value based on IsLatest. + pub fn set_is_current(&mut self, is_current:bool) { + self.is_current = Some(is_current); + } + /// User defined metadata of this entry /// /// The prefix of the user defined metadata key(for example: in oss, it's x-oss-meta-)