Multipart upload part head objects are bucket-indexed with
RGWObjCategory::Main, making them indistinguishable from completed
objects in bucket stats. This is causing radosgw-admin bucket stats and
the RGW-extension X-RGW-Object-Count header on HEAD Bucket
(?read-stats=true) to report inflated object counts when in-progress
or abandoned multipart uploads exists.
So, this commit adds a new Object Category: RGWObjCategory::MultiPart
(value 5) and assigns it in MultipartObjectProcessor::complete() so
part heads are now tracked under a separate "rgw.multipart" category.
The X-RGW-Object-Count header, which reads only RGWObjCategory::Main,
now excludes in-progress parts. This is more correct as AWS S3 HEAD Bucket
does not expose any object count for incomplete uploads (the header itself
seems to be an RGW extension, not part of the S3 specification).
Quota enforcement, stats aggregation, and part cleanup are all
category-agnostic so should require no changes.
Also, updated the test_cls_rgw_stats simulator to use
the new category for multipart part entries.
Fixes: https://tracker.ceph.com/issues/77509
Signed-off-by: Oguzhan Ozmen <oozmen@bloomberg.net>
case RGWObjCategory::Shadow: return "rgw.shadow";
case RGWObjCategory::MultiMeta: return "rgw.multimeta";
case RGWObjCategory::CloudTiered: return "rgw.cloudtiered";
+ case RGWObjCategory::MultiPart: return "rgw.multipart";
default: return "unknown";
}
}
MultiMeta = 3, // b-i entries for multipart upload metadata objs
CloudTiered = 4, // b-i entries which are tiered to external cloud
+
+ MultiPart = 5, // b-i entries for multipart upload part head objs
};
std::string_view to_string(RGWObjCategory c);
obj_op.meta.mtime = mtime;
obj_op.meta.owner = owner;
obj_op.meta.bucket_owner = bucket_info.owner;
+ obj_op.meta.category = RGWObjCategory::MultiPart;
obj_op.meta.delete_at = delete_at;
obj_op.meta.zones_trace = zones_trace;
obj_op.meta.modify_tail = true;
<< " size=" << part_size << dendl;
} else {
rgw_bucket_dir_entry_meta meta;
- meta.category = op.meta.category;
+ meta.category = RGWObjCategory::MultiPart;
meta.size = meta.accounted_size = part_size;
int r = index_complete(ioctx, oid, part_key, op.tag, op.type,