mirror of
https://github.com/rustfs/rustfs.git
synced 2026-08-05 21:07:43 +00:00
+35
-9
@@ -6,7 +6,7 @@ use ecstore::{
|
||||
UpdateMetadataOpts, WalkDirOptions,
|
||||
},
|
||||
erasure::Writer,
|
||||
heal::data_usage_cache::DataUsageCache,
|
||||
heal::{data_usage_cache::DataUsageCache, heal_commands::HealOpts},
|
||||
peer::{LocalPeerS3Client, PeerS3Client},
|
||||
store::{all_local_disk_path, find_local_disk},
|
||||
store_api::{BucketOptions, DeleteBucketOptions, FileInfo, MakeBucketOptions},
|
||||
@@ -21,14 +21,14 @@ use protos::{
|
||||
DeleteBucketResponse, DeletePathsRequest, DeletePathsResponse, DeleteRequest, DeleteResponse, DeleteVersionRequest,
|
||||
DeleteVersionResponse, DeleteVersionsRequest, DeleteVersionsResponse, DeleteVolumeRequest, DeleteVolumeResponse,
|
||||
DiskInfoRequest, DiskInfoResponse, GenerallyLockRequest, GenerallyLockResponse, GetBucketInfoRequest,
|
||||
GetBucketInfoResponse, ListBucketRequest, ListBucketResponse, ListDirRequest, ListDirResponse, ListVolumesRequest,
|
||||
ListVolumesResponse, MakeBucketRequest, MakeBucketResponse, MakeVolumeRequest, MakeVolumeResponse, MakeVolumesRequest,
|
||||
MakeVolumesResponse, NsScannerRequest, NsScannerResponse, PingRequest, PingResponse, ReadAllRequest, ReadAllResponse,
|
||||
ReadAtRequest, ReadAtResponse, ReadMultipleRequest, ReadMultipleResponse, ReadVersionRequest, ReadVersionResponse,
|
||||
ReadXlRequest, ReadXlResponse, RenameDataRequest, RenameDataResponse, RenameFileRequst, RenameFileResponse,
|
||||
RenamePartRequst, RenamePartResponse, StatVolumeRequest, StatVolumeResponse, UpdateMetadataRequest,
|
||||
UpdateMetadataResponse, VerifyFileRequest, VerifyFileResponse, WalkDirRequest, WalkDirResponse, WriteAllRequest,
|
||||
WriteAllResponse, WriteMetadataRequest, WriteMetadataResponse, WriteRequest, WriteResponse,
|
||||
GetBucketInfoResponse, HealBucketRequest, HealBucketResponse, ListBucketRequest, ListBucketResponse, ListDirRequest,
|
||||
ListDirResponse, ListVolumesRequest, ListVolumesResponse, MakeBucketRequest, MakeBucketResponse, MakeVolumeRequest,
|
||||
MakeVolumeResponse, MakeVolumesRequest, MakeVolumesResponse, NsScannerRequest, NsScannerResponse, PingRequest,
|
||||
PingResponse, ReadAllRequest, ReadAllResponse, ReadAtRequest, ReadAtResponse, ReadMultipleRequest, ReadMultipleResponse,
|
||||
ReadVersionRequest, ReadVersionResponse, ReadXlRequest, ReadXlResponse, RenameDataRequest, RenameDataResponse,
|
||||
RenameFileRequst, RenameFileResponse, RenamePartRequst, RenamePartResponse, StatVolumeRequest, StatVolumeResponse,
|
||||
UpdateMetadataRequest, UpdateMetadataResponse, VerifyFileRequest, VerifyFileResponse, WalkDirRequest, WalkDirResponse,
|
||||
WriteAllRequest, WriteAllResponse, WriteMetadataRequest, WriteMetadataResponse, WriteRequest, WriteResponse,
|
||||
},
|
||||
};
|
||||
use tokio::sync::mpsc;
|
||||
@@ -110,6 +110,32 @@ impl Node for NodeService {
|
||||
}))
|
||||
}
|
||||
|
||||
async fn heal_bucket(&self, request: Request<HealBucketRequest>) -> Result<Response<HealBucketResponse>, Status> {
|
||||
debug!("heal bucket");
|
||||
let request = request.into_inner();
|
||||
let options = match serde_json::from_str::<HealOpts>(&request.options) {
|
||||
Ok(options) => options,
|
||||
Err(err) => {
|
||||
return Ok(tonic::Response::new(HealBucketResponse {
|
||||
success: false,
|
||||
error_info: Some(format!("decode HealOpts failed: {}", err)),
|
||||
}))
|
||||
}
|
||||
};
|
||||
|
||||
match self.local_peer.heal_bucket(&request.bucket, &options).await {
|
||||
Ok(_) => Ok(tonic::Response::new(HealBucketResponse {
|
||||
success: true,
|
||||
error_info: None,
|
||||
})),
|
||||
|
||||
Err(err) => Ok(tonic::Response::new(HealBucketResponse {
|
||||
success: false,
|
||||
error_info: Some(format!("heal bucket failed: {}", err)),
|
||||
})),
|
||||
}
|
||||
}
|
||||
|
||||
async fn list_bucket(&self, request: Request<ListBucketRequest>) -> Result<Response<ListBucketResponse>, Status> {
|
||||
debug!("list bucket");
|
||||
|
||||
|
||||
@@ -51,7 +51,7 @@ impl S3Access for FS {
|
||||
|
||||
let req_info = ReqInfo {
|
||||
card: cx.credentials().cloned(),
|
||||
action: action,
|
||||
action,
|
||||
..Default::default()
|
||||
};
|
||||
|
||||
|
||||
+10
-17
@@ -341,15 +341,14 @@ impl S3 for FS {
|
||||
|
||||
let content_type = {
|
||||
if let Some(content_type) = info.content_type {
|
||||
let ct = match ContentType::from_str(&content_type) {
|
||||
match ContentType::from_str(&content_type) {
|
||||
Ok(res) => Some(res),
|
||||
Err(err) => {
|
||||
error!("parse content-type err {} {:?}", &content_type, err);
|
||||
//
|
||||
None
|
||||
}
|
||||
};
|
||||
ct
|
||||
}
|
||||
} else {
|
||||
None
|
||||
}
|
||||
@@ -411,15 +410,14 @@ impl S3 for FS {
|
||||
|
||||
let content_type = {
|
||||
if let Some(content_type) = info.content_type {
|
||||
let ct = match ContentType::from_str(&content_type) {
|
||||
match ContentType::from_str(&content_type) {
|
||||
Ok(res) => Some(res),
|
||||
Err(err) => {
|
||||
error!("parse content-type err {} {:?}", &content_type, err);
|
||||
//
|
||||
None
|
||||
}
|
||||
};
|
||||
ct
|
||||
}
|
||||
} else {
|
||||
None
|
||||
}
|
||||
@@ -1536,9 +1534,7 @@ impl S3 for FS {
|
||||
}
|
||||
}
|
||||
|
||||
let mut grants = Vec::new();
|
||||
|
||||
grants.push(Grant {
|
||||
let grants = vec![Grant {
|
||||
grantee: Some(Grantee {
|
||||
type_: Type::from_static(Type::CANONICAL_USER),
|
||||
display_name: None,
|
||||
@@ -1547,12 +1543,11 @@ impl S3 for FS {
|
||||
uri: None,
|
||||
}),
|
||||
permission: Some(Permission::from_static(Permission::FULL_CONTROL)),
|
||||
});
|
||||
}];
|
||||
|
||||
Ok(S3Response::new(GetBucketAclOutput {
|
||||
grants: Some(grants),
|
||||
owner: Some(RUSTFS_OWNER.to_owned()),
|
||||
..Default::default()
|
||||
}))
|
||||
}
|
||||
|
||||
@@ -1589,7 +1584,7 @@ impl S3 for FS {
|
||||
v.grants.is_some_and(|gs| {
|
||||
//
|
||||
!gs.is_empty()
|
||||
&& gs.get(0).is_some_and(|g| {
|
||||
&& gs.first().is_some_and(|g| {
|
||||
g.to_owned()
|
||||
.permission
|
||||
.is_some_and(|p| p.as_str() == Permission::FULL_CONTROL)
|
||||
@@ -1617,9 +1612,7 @@ impl S3 for FS {
|
||||
return Err(S3Error::with_message(S3ErrorCode::InternalError, format!("{}", e)));
|
||||
}
|
||||
|
||||
let mut grants = Vec::new();
|
||||
|
||||
grants.push(Grant {
|
||||
let grants = vec![Grant {
|
||||
grantee: Some(Grantee {
|
||||
type_: Type::from_static(Type::CANONICAL_USER),
|
||||
display_name: None,
|
||||
@@ -1628,7 +1621,7 @@ impl S3 for FS {
|
||||
uri: None,
|
||||
}),
|
||||
permission: Some(Permission::from_static(Permission::FULL_CONTROL)),
|
||||
});
|
||||
}];
|
||||
|
||||
Ok(S3Response::new(GetObjectAclOutput {
|
||||
grants: Some(grants),
|
||||
@@ -1665,7 +1658,7 @@ impl S3 for FS {
|
||||
v.grants.is_some_and(|gs| {
|
||||
//
|
||||
!gs.is_empty()
|
||||
&& gs.get(0).is_some_and(|g| {
|
||||
&& gs.first().is_some_and(|g| {
|
||||
g.to_owned()
|
||||
.permission
|
||||
.is_some_and(|p| p.as_str() == Permission::FULL_CONTROL)
|
||||
|
||||
Reference in New Issue
Block a user