fix: missing object.key in S3 event notifications for multipart uploads #1609 (#1624)

Co-authored-by: houseme <housemecn@gmail.com>
This commit is contained in:
heihutu
2026-01-27 13:32:56 +08:00
committed by GitHub
parent db29c0cae2
commit 74759b6e99
4 changed files with 176 additions and 31 deletions
+11 -8
View File
@@ -111,7 +111,8 @@ use rustfs_targets::{
arn::{ARN, TargetIDError},
};
use rustfs_utils::{
CompressionAlgorithm, extract_req_params_header, extract_resp_elements, get_request_host, get_request_user_agent,
CompressionAlgorithm, extract_params_header, extract_resp_elements, get_request_host, get_request_port,
get_request_user_agent,
http::{
AMZ_BUCKET_REPLICATION_STATUS, AMZ_CHECKSUM_MODE, AMZ_CHECKSUM_TYPE,
headers::{
@@ -387,10 +388,11 @@ impl FS {
event_name: EventName::ObjectCreatedPut,
bucket_name: bucket.clone(),
object: _obj_info.clone(),
req_params: extract_req_params_header(&req.headers),
req_params: extract_params_header(&req.headers),
resp_elements: extract_resp_elements(&S3Response::new(output.clone())),
version_id: version_id.clone(),
host: get_request_host(&req.headers),
port: get_request_port(&req.headers),
user_agent: get_request_user_agent(&req.headers),
};
@@ -739,11 +741,12 @@ impl S3 for FS {
}
}
let region = rustfs_ecstore::global::get_global_region().unwrap_or_else(|| "us-east-1".to_string());
let output = CompleteMultipartUploadOutput {
bucket: Some(bucket.clone()),
key: Some(key.clone()),
e_tag: obj_info.etag.clone().map(|etag| to_s3s_etag(&etag)),
location: Some("us-east-1".to_string()),
location: Some(region.clone()),
server_side_encryption: server_side_encryption.clone(), // TDD: Return encryption info
ssekms_key_id: ssekms_key_id.clone(), // TDD: Return KMS key ID if present
checksum_crc32: checksum_crc32.clone(),
@@ -764,7 +767,7 @@ impl S3 for FS {
bucket: Some(bucket.clone()),
key: Some(key.clone()),
e_tag: obj_info.etag.clone().map(|etag| to_s3s_etag(&etag)),
location: Some("us-east-1".to_string()),
location: Some(region),
server_side_encryption, // TDD: Return encryption info
ssekms_key_id, // TDD: Return KMS key ID if present
checksum_crc32,
@@ -777,10 +780,10 @@ impl S3 for FS {
};
let mt2 = HashMap::new();
let repoptions =
let replicate_options =
get_must_replicate_options(&mt2, "".to_string(), ReplicationStatusType::Empty, ReplicationType::Object, opts.clone());
let dsc = must_replicate(&bucket, &key, repoptions).await;
let dsc = must_replicate(&bucket, &key, replicate_options).await;
if dsc.replicate_any() {
warn!("need multipart replication");
@@ -792,7 +795,7 @@ impl S3 for FS {
);
// Set object info for event notification
helper = helper.object(obj_info.clone());
helper = helper.object(obj_info);
if let Some(version_id) = &mpu_version_for_event {
helper = helper.version_id(version_id.clone());
}
@@ -2031,7 +2034,7 @@ impl S3 for FS {
},
)
.version_id(dobj.version_id.map(|v| v.to_string()).unwrap_or_default())
.req_params(extract_req_params_header(&req_headers))
.req_params(extract_params_header(&req_headers))
.resp_elements(extract_resp_elements(&S3Response::new(DeleteObjectsOutput::default())))
.host(get_request_host(&req_headers))
.user_agent(get_request_user_agent(&req_headers))
+3 -2
View File
@@ -21,7 +21,7 @@ use rustfs_ecstore::store_api::ObjectInfo;
use rustfs_notify::{EventArgsBuilder, notifier_global};
use rustfs_targets::EventName;
use rustfs_utils::{
extract_req_params, extract_req_params_header, extract_resp_elements, get_request_host, get_request_user_agent,
extract_params_header, extract_req_params, extract_resp_elements, get_request_host, get_request_port, get_request_user_agent,
};
use s3s::{S3Request, S3Response, S3Result};
use std::future::Future;
@@ -96,8 +96,9 @@ impl OperationHelper {
// object is a placeholder that must be set later using the `object()` method.
let event_builder = EventArgsBuilder::new(event, bucket, ObjectInfo::default())
.host(get_request_host(&req.headers))
.port(get_request_port(&req.headers))
.user_agent(get_request_user_agent(&req.headers))
.req_params(extract_req_params_header(&req.headers));
.req_params(extract_params_header(&req.headers));
Self {
audit_builder: Some(audit_builder),