#define RGW_POSIX_ATTR_MPUPLOAD "POSIX-Multipart-Upload"
#define RGW_POSIX_ATTR_OWNER "POSIX-Owner"
#define RGW_POSIX_ATTR_OBJECT_TYPE "POSIX-Object-Type"
+#define RGW_POSIX_ATTR_MANIFEST "POSIX-Manifest"
const std::string mp_ns = "multipart";
const std::string MP_OBJ_PART_PFX = "part-";
const std::string MP_OBJ_HEAD_NAME = MP_OBJ_PART_PFX + "00000";
return -EINVAL;
}
+ buffer::list manifest_bl;
+ if (source->get_attr(RGW_POSIX_ATTR_MANIFEST, manifest_bl)) {
+ POSIXManifest manifest;
+ auto iter = manifest_bl.cbegin();
+ try {
+ manifest.decode(iter);
+ if (manifest.multipart_part_count > 0) {
+ params.parts_count = manifest.multipart_part_count;
+ }
+ } catch (buffer::error& err) {
+ // pass
+ }
+ }
+
#if 0 // WIP
if (params.mod_ptr || params.unmod_ptr) {
obj_time_weight src_weight;
attrs[RGW_ATTR_COMPRESSION] = tmp;
}
+ POSIXManifest manifest;
+ manifest.multipart_part_count = total_parts;
+ buffer::list manifest_bl;
+ manifest.encode(manifest_bl);
+ attrs[RGW_POSIX_ATTR_MANIFEST] = manifest_bl;
+
ret = shadow->merge_and_store_attrs(dpp, attrs, y);
if (ret < 0) {
return ret;
int write_attrs(const DoutPrefixProvider *dpp, optional_yield y);
}; /* POSIXBucket */
+struct POSIXManifest {
+ int64_t multipart_part_count{-1};
+
+ void encode(bufferlist &bl) const {
+ ENCODE_START(1, 1, bl);
+ encode(multipart_part_count, bl);
+ ENCODE_FINISH(bl);
+ }
+
+ void decode(bufferlist::const_iterator &bl) {
+ DECODE_START(1, bl);
+ decode(multipart_part_count, bl);
+ DECODE_FINISH(bl);
+ }
+};
+WRITE_CLASS_ENCODER(POSIXManifest);
+
class POSIXObject : public StoreObject {
public:
private: