From 13c0353dae07d8a4bf2fcc54461520d4e0fdd1a4 Mon Sep 17 00:00:00 2001 From: weisd Date: Sat, 23 Nov 2024 18:48:30 +0800 Subject: [PATCH] fix:#127 --- rustfs/src/storage/ecfs.rs | 220 +++++++++++++----------------------- rustfs/src/storage/error.rs | 2 +- scripts/run.sh | 2 +- 3 files changed, 82 insertions(+), 142 deletions(-) diff --git a/rustfs/src/storage/ecfs.rs b/rustfs/src/storage/ecfs.rs index 202247d1..53c1b3e6 100644 --- a/rustfs/src/storage/ecfs.rs +++ b/rustfs/src/storage/ecfs.rs @@ -298,13 +298,10 @@ impl S3 for FS { None => return Err(S3Error::with_message(S3ErrorCode::InternalError, "Not init".to_string())), }; - if let Err(e) = store.get_bucket_info(&input.bucket, &BucketOptions::default()).await { - if DiskError::VolumeNotFound.is(&e) { - return Err(s3_error!(NoSuchBucket)); - } else { - return Err(S3Error::with_message(S3ErrorCode::InternalError, format!("{}", e))); - } - } + store + .get_bucket_info(&input.bucket, &BucketOptions::default()) + .await + .map_err(to_s3_error)?; let output = GetBucketLocationOutput::default(); Ok(S3Response::new(output)) @@ -377,13 +374,10 @@ impl S3 for FS { None => return Err(S3Error::with_message(S3ErrorCode::InternalError, "Not init".to_string())), }; - if let Err(e) = store.get_bucket_info(&input.bucket, &BucketOptions::default()).await { - if DiskError::VolumeNotFound.is(&e) { - return Err(s3_error!(NoSuchBucket)); - } else { - return Err(S3Error::with_message(S3ErrorCode::InternalError, format!("{}", e))); - } - } + store + .get_bucket_info(&input.bucket, &BucketOptions::default()) + .await + .map_err(to_s3_error)?; // mc cp step 2 GetBucketInfo Ok(S3Response::new(HeadBucketOutput::default())) @@ -860,13 +854,10 @@ impl S3 for FS { None => return Err(S3Error::with_message(S3ErrorCode::InternalError, "Not init".to_string())), }; - if let Err(e) = store.get_bucket_info(&bucket, &BucketOptions::default()).await { - if DiskError::VolumeNotFound.is(&e) { - return Err(s3_error!(NoSuchBucket)); - } else { - return Err(S3Error::with_message(S3ErrorCode::InternalError, format!("{}", e))); - } - } + store + .get_bucket_info(&bucket, &BucketOptions::default()) + .await + .map_err(to_s3_error)?; let data = try_!(xml::serialize(&tagging)); @@ -979,13 +970,10 @@ impl S3 for FS { None => return Err(S3Error::with_message(S3ErrorCode::InternalError, "Not init".to_string())), }; - if let Err(e) = store.get_bucket_info(&bucket, &BucketOptions::default()).await { - if DiskError::VolumeNotFound.is(&e) { - return Err(s3_error!(NoSuchBucket)); - } else { - return Err(S3Error::with_message(S3ErrorCode::InternalError, format!("{}", e))); - } - } + store + .get_bucket_info(&bucket, &BucketOptions::default()) + .await + .map_err(to_s3_error)?; let VersioningConfiguration { status, .. } = BucketVersioningSys::get(&bucket).await.map_err(to_s3_error)?; @@ -1038,13 +1026,10 @@ impl S3 for FS { .as_ref() .ok_or_else(|| S3Error::with_message(S3ErrorCode::InternalError, "Not init"))?; - if let Err(e) = store.get_bucket_info(&bucket, &BucketOptions::default()).await { - if DiskError::VolumeNotFound.is(&e) { - return Err(s3_error!(NoSuchBucket)); - } else { - return Err(S3Error::with_message(S3ErrorCode::InternalError, format!("{}", e))); - } - } + store + .get_bucket_info(&bucket, &BucketOptions::default()) + .await + .map_err(to_s3_error)?; let cfg = match PolicySys::get(&bucket).await { Ok(res) => res, @@ -1070,13 +1055,10 @@ impl S3 for FS { .as_ref() .ok_or_else(|| S3Error::with_message(S3ErrorCode::InternalError, "Not init"))?; - if let Err(e) = store.get_bucket_info(&bucket, &BucketOptions::default()).await { - if DiskError::VolumeNotFound.is(&e) { - return Err(s3_error!(NoSuchBucket)); - } else { - return Err(S3Error::with_message(S3ErrorCode::InternalError, format!("{}", e))); - } - } + store + .get_bucket_info(&bucket, &BucketOptions::default()) + .await + .map_err(to_s3_error)?; // warn!("input policy {}", &policy); @@ -1110,13 +1092,10 @@ impl S3 for FS { .as_ref() .ok_or_else(|| S3Error::with_message(S3ErrorCode::InternalError, "Not init"))?; - if let Err(e) = store.get_bucket_info(&bucket, &BucketOptions::default()).await { - if DiskError::VolumeNotFound.is(&e) { - return Err(s3_error!(NoSuchBucket)); - } else { - return Err(S3Error::with_message(S3ErrorCode::InternalError, format!("{}", e))); - } - } + store + .get_bucket_info(&bucket, &BucketOptions::default()) + .await + .map_err(to_s3_error)?; metadata_sys::delete(&bucket, BUCKET_POLICY_CONFIG) .await @@ -1138,13 +1117,10 @@ impl S3 for FS { .as_ref() .ok_or_else(|| S3Error::with_message(S3ErrorCode::InternalError, "Not init"))?; - if let Err(e) = store.get_bucket_info(&bucket, &BucketOptions::default()).await { - if DiskError::VolumeNotFound.is(&e) { - return Err(s3_error!(NoSuchBucket)); - } else { - return Err(S3Error::with_message(S3ErrorCode::InternalError, format!("{}", e))); - } - } + store + .get_bucket_info(&bucket, &BucketOptions::default()) + .await + .map_err(to_s3_error)?; let rules = match metadata_sys::get_lifecycle_config(&bucket).await { Ok((cfg, _)) => Some(cfg.rules), @@ -1201,13 +1177,10 @@ impl S3 for FS { .as_ref() .ok_or_else(|| S3Error::with_message(S3ErrorCode::InternalError, "Not init"))?; - if let Err(e) = store.get_bucket_info(&bucket, &BucketOptions::default()).await { - if DiskError::VolumeNotFound.is(&e) { - return Err(s3_error!(NoSuchBucket)); - } else { - return Err(S3Error::with_message(S3ErrorCode::InternalError, format!("{}", e))); - } - } + store + .get_bucket_info(&bucket, &BucketOptions::default()) + .await + .map_err(to_s3_error)?; metadata_sys::delete(&bucket, BUCKET_LIFECYCLE_CONFIG) .await @@ -1228,13 +1201,10 @@ impl S3 for FS { .as_ref() .ok_or_else(|| S3Error::with_message(S3ErrorCode::InternalError, "Not init"))?; - if let Err(e) = store.get_bucket_info(&bucket, &BucketOptions::default()).await { - if DiskError::VolumeNotFound.is(&e) { - return Err(s3_error!(NoSuchBucket)); - } else { - return Err(S3Error::with_message(S3ErrorCode::InternalError, format!("{}", e))); - } - } + store + .get_bucket_info(&bucket, &BucketOptions::default()) + .await + .map_err(to_s3_error)?; let server_side_encryption_configuration = match metadata_sys::get_sse_config(&bucket).await { Ok((cfg, _)) => Some(cfg), @@ -1270,13 +1240,10 @@ impl S3 for FS { .as_ref() .ok_or_else(|| S3Error::with_message(S3ErrorCode::InternalError, "Not init"))?; - if let Err(e) = store.get_bucket_info(&bucket, &BucketOptions::default()).await { - if DiskError::VolumeNotFound.is(&e) { - return Err(s3_error!(NoSuchBucket)); - } else { - return Err(S3Error::with_message(S3ErrorCode::InternalError, format!("{}", e))); - } - } + store + .get_bucket_info(&bucket, &BucketOptions::default()) + .await + .map_err(to_s3_error)?; // TODO: check kms @@ -1299,13 +1266,10 @@ impl S3 for FS { .as_ref() .ok_or_else(|| S3Error::with_message(S3ErrorCode::InternalError, "Not init"))?; - if let Err(e) = store.get_bucket_info(&bucket, &BucketOptions::default()).await { - if DiskError::VolumeNotFound.is(&e) { - return Err(s3_error!(NoSuchBucket)); - } else { - return Err(S3Error::with_message(S3ErrorCode::InternalError, format!("{}", e))); - } - } + store + .get_bucket_info(&bucket, &BucketOptions::default()) + .await + .map_err(to_s3_error)?; metadata_sys::delete(&bucket, BUCKET_SSECONFIG).await.map_err(to_s3_error)?; Ok(S3Response::new(DeleteBucketEncryptionOutput::default())) @@ -1352,13 +1316,10 @@ impl S3 for FS { .as_ref() .ok_or_else(|| S3Error::with_message(S3ErrorCode::InternalError, "Not init"))?; - if let Err(e) = store.get_bucket_info(&bucket, &BucketOptions::default()).await { - if DiskError::VolumeNotFound.is(&e) { - return Err(s3_error!(NoSuchBucket)); - } else { - return Err(S3Error::with_message(S3ErrorCode::InternalError, format!("{}", e))); - } - } + store + .get_bucket_info(&bucket, &BucketOptions::default()) + .await + .map_err(to_s3_error)?; let data = try_!(xml::serialize(&input_cfg)); @@ -1381,13 +1342,10 @@ impl S3 for FS { .as_ref() .ok_or_else(|| S3Error::with_message(S3ErrorCode::InternalError, "Not init"))?; - if let Err(e) = store.get_bucket_info(&bucket, &BucketOptions::default()).await { - if DiskError::VolumeNotFound.is(&e) { - return Err(s3_error!(NoSuchBucket)); - } else { - return Err(S3Error::with_message(S3ErrorCode::InternalError, format!("{}", e))); - } - } + store + .get_bucket_info(&bucket, &BucketOptions::default()) + .await + .map_err(to_s3_error)?; let replication_configuration = match metadata_sys::get_replication_config(&bucket).await { Ok((cfg, _created)) => Some(cfg), @@ -1418,13 +1376,10 @@ impl S3 for FS { .as_ref() .ok_or_else(|| S3Error::with_message(S3ErrorCode::InternalError, "Not init"))?; - if let Err(e) = store.get_bucket_info(&bucket, &BucketOptions::default()).await { - if DiskError::VolumeNotFound.is(&e) { - return Err(s3_error!(NoSuchBucket)); - } else { - return Err(S3Error::with_message(S3ErrorCode::InternalError, format!("{}", e))); - } - } + store + .get_bucket_info(&bucket, &BucketOptions::default()) + .await + .map_err(to_s3_error)?; // TODO: check enable, versioning enable let data = try_!(xml::serialize(&replication_configuration)); @@ -1448,13 +1403,10 @@ impl S3 for FS { .as_ref() .ok_or_else(|| S3Error::with_message(S3ErrorCode::InternalError, "Not init"))?; - if let Err(e) = store.get_bucket_info(&bucket, &BucketOptions::default()).await { - if DiskError::VolumeNotFound.is(&e) { - return Err(s3_error!(NoSuchBucket)); - } else { - return Err(S3Error::with_message(S3ErrorCode::InternalError, format!("{}", e))); - } - } + store + .get_bucket_info(&bucket, &BucketOptions::default()) + .await + .map_err(to_s3_error)?; metadata_sys::delete(&bucket, BUCKET_REPLICATION_CONFIG) .await .map_err(to_s3_error)?; @@ -1476,13 +1428,10 @@ impl S3 for FS { .as_ref() .ok_or_else(|| S3Error::with_message(S3ErrorCode::InternalError, "Not init"))?; - if let Err(e) = store.get_bucket_info(&bucket, &BucketOptions::default()).await { - if DiskError::VolumeNotFound.is(&e) { - return Err(s3_error!(NoSuchBucket)); - } else { - return Err(S3Error::with_message(S3ErrorCode::InternalError, format!("{}", e))); - } - } + store + .get_bucket_info(&bucket, &BucketOptions::default()) + .await + .map_err(to_s3_error)?; let has_notification_config = match metadata_sys::get_notification_config(&bucket).await { Ok(cfg) => cfg, @@ -1528,13 +1477,10 @@ impl S3 for FS { .as_ref() .ok_or_else(|| S3Error::with_message(S3ErrorCode::InternalError, "Not init"))?; - if let Err(e) = store.get_bucket_info(&bucket, &BucketOptions::default()).await { - if DiskError::VolumeNotFound.is(&e) { - return Err(s3_error!(NoSuchBucket)); - } else { - return Err(S3Error::with_message(S3ErrorCode::InternalError, format!("{}", e))); - } - } + store + .get_bucket_info(&bucket, &BucketOptions::default()) + .await + .map_err(to_s3_error)?; let data = try_!(xml::serialize(¬ification_configuration)); @@ -1556,13 +1502,10 @@ impl S3 for FS { .as_ref() .ok_or_else(|| S3Error::with_message(S3ErrorCode::InternalError, "Not init"))?; - if let Err(e) = store.get_bucket_info(&bucket, &BucketOptions::default()).await { - if DiskError::VolumeNotFound.is(&e) { - return Err(s3_error!(NoSuchBucket)); - } else { - return Err(S3Error::with_message(S3ErrorCode::InternalError, format!("{}", e))); - } - } + store + .get_bucket_info(&bucket, &BucketOptions::default()) + .await + .map_err(to_s3_error)?; let grants = vec![Grant { grantee: Some(Grantee { @@ -1597,13 +1540,10 @@ impl S3 for FS { .as_ref() .ok_or_else(|| S3Error::with_message(S3ErrorCode::InternalError, "Not init"))?; - if let Err(e) = store.get_bucket_info(&bucket, &BucketOptions::default()).await { - if DiskError::VolumeNotFound.is(&e) { - return Err(s3_error!(NoSuchBucket)); - } else { - return Err(S3Error::with_message(S3ErrorCode::InternalError, format!("{}", e))); - } - } + store + .get_bucket_info(&bucket, &BucketOptions::default()) + .await + .map_err(to_s3_error)?; if let Some(canned_acl) = acl { if canned_acl.as_str() != BucketCannedACL::PRIVATE { diff --git a/rustfs/src/storage/error.rs b/rustfs/src/storage/error.rs index 62e6f85f..c767339b 100644 --- a/rustfs/src/storage/error.rs +++ b/rustfs/src/storage/error.rs @@ -10,7 +10,7 @@ pub fn to_s3_error(err: Error) -> S3Error { } StorageError::MethodNotAllowed => s3_error!(MethodNotAllowed), StorageError::BucketNotFound(bucket) => { - s3_error!(InvalidArgument, "bucket not found {}", bucket) + s3_error!(NoSuchBucket, "bucket not found {}", bucket) } StorageError::BucketNotEmpty(bucket) => s3_error!(BucketNotEmpty, "bucket not empty {}", bucket), StorageError::BucketNameInvalid(bucket) => s3_error!(InvalidBucketName, "invalid bucket name {}", bucket), diff --git a/scripts/run.sh b/scripts/run.sh index 261ee695..e7bd04f0 100755 --- a/scripts/run.sh +++ b/scripts/run.sh @@ -7,7 +7,7 @@ mkdir -p ./target/volume/test{0..4} if [ -z "$RUST_LOG" ]; then - export RUST_LOG="rustfs=debug,ecstore=debug,s3s=info,reader=debug,router=debug" + export RUST_LOG="rustfs=debug,ecstore=debug,s3s=debug,reader=debug,router=debug" fi # export RUSTFS_ERASURE_SET_DRIVE_COUNT=5