update bucket tagging op use bucketmetadata_sys

This commit is contained in:
weisd
2024-10-05 01:41:19 +08:00
parent c29199515c
commit 1092b2696a
7 changed files with 168 additions and 103 deletions
-1
View File
@@ -265,7 +265,6 @@ impl BucketMetadata {
fn parse_all_configs(&mut self, _api: &ECStore) -> Result<()> {
if !self.tagging_config_xml.is_empty() {
warn!("self.tagging_config_xml {:?}", &self.tagging_config_xml);
self.tagging_config = Some(tags::Tags::unmarshal(&self.tagging_config_xml)?);
}
+25 -5
View File
@@ -31,7 +31,7 @@ pub async fn get_bucket_metadata_sys() -> Arc<RwLock<BucketMetadataSys>> {
GLOBAL_BucketMetadataSys.clone()
}
pub async fn bucket_metadata_sys_set(bucket: &str, bm: BucketMetadata) {
pub async fn bucket_metadata_sys_set(bucket: String, bm: BucketMetadata) {
let sys = GLOBAL_BucketMetadataSys.write().await;
sys.set(bucket, bm).await
}
@@ -135,10 +135,10 @@ impl BucketMetadataSys {
}
}
pub async fn set(&self, bucket: &str, bm: BucketMetadata) {
if !is_meta_bucketname(bucket) {
pub async fn set(&self, bucket: String, bm: BucketMetadata) {
if !is_meta_bucketname(&bucket) {
let mut map = self.metadata_map.write().await;
map.insert(bucket.to_string(), bm);
map.insert(bucket, bm);
}
}
@@ -176,11 +176,30 @@ impl BucketMetadataSys {
let updated = bm.update_config(config_file, data)?;
bm.save(store).await?;
self.save(&mut bm).await?;
Ok(updated)
}
async fn save(&self, bm: &mut BucketMetadata) -> Result<()> {
let layer = new_object_layer_fn();
let lock = layer.read().await;
let store = match lock.as_ref() {
Some(s) => s,
None => return Err(Error::msg("errServerNotInitialized")),
};
if is_meta_bucketname(&bm.name) {
return Err(Error::msg("errInvalidArgument"));
}
bm.save(store).await?;
self.set(bm.name.clone(), bm.clone()).await;
Ok(())
}
pub async fn get_config(&self, bucket: &str) -> Result<(BucketMetadata, bool)> {
if let Some(api) = self.api.as_ref() {
let has_bm = {
@@ -221,6 +240,7 @@ impl BucketMetadataSys {
let bm = match self.get_config(bucket).await {
Ok((res, _)) => res,
Err(err) => {
warn!("get_tagging_config err {:?}", &err);
if config::error::is_not_found(&err) {
return Err(Error::new(BucketMetadataError::TaggingNotFound));
} else {
+1 -1
View File
@@ -8,7 +8,7 @@ mod objectlock;
mod policy;
mod quota;
mod replication;
mod tags;
pub mod tags;
mod target;
pub mod utils;
mod versioning;
+9 -8
View File
@@ -1,4 +1,4 @@
use crate::error::{Error, Result};
use crate::error::Result;
use rmp_serde::Serializer as rmpSerializer;
use serde::{Deserialize, Serialize};
use std::collections::HashMap;
@@ -6,21 +6,22 @@ use std::collections::HashMap;
// 定义tagSet结构体
#[derive(Debug, Deserialize, Serialize, Default, Clone)]
pub struct TagSet {
#[serde(rename = "Tag")]
tag_map: HashMap<String, String>,
is_object: bool,
pub tag_map: HashMap<String, String>,
pub is_object: bool,
}
// 定义tagging结构体
#[derive(Debug, Deserialize, Serialize, Default, Clone)]
pub struct Tags {
#[serde(rename = "Tagging")]
xml_name: String,
#[serde(rename = "TagSet")]
tag_set: Option<TagSet>,
pub tag_set: TagSet,
}
impl Tags {
pub fn new(tag_map: HashMap<String, String>, is_object: bool) -> Self {
Self {
tag_set: TagSet { tag_map, is_object },
}
}
pub fn marshal_msg(&self) -> Result<Vec<u8>> {
let mut buf = Vec::new();
+1
View File
@@ -5,6 +5,7 @@ use crate::store_api::{HTTPRangeSpec, ObjectIO, ObjectInfo, ObjectOptions, PutOb
use http::HeaderMap;
use s3s::dto::StreamingBlob;
use s3s::Body;
use tracing::warn;
use super::error::ConfigError;
+1 -1
View File
@@ -510,7 +510,7 @@ impl StorageAPI for ECStore {
let mut meta = BucketMetadata::new(bucket);
meta.save(self).await?;
bucket_metadata_sys_set(bucket, meta).await;
bucket_metadata_sys_set(bucket.to_string(), meta).await;
// TODO: toObjectErr