diff --git a/qa/suites/rgw/multisite/overrides.yaml b/qa/suites/rgw/multisite/overrides.yaml index 9c383fc78da..de0364adf82 100644 --- a/qa/suites/rgw/multisite/overrides.yaml +++ b/qa/suites/rgw/multisite/overrides.yaml @@ -11,5 +11,6 @@ overrides: rgw curl low speed time: 300 rgw md log max shards: 4 rgw data log num shards: 4 + rgw sync obj etag verify: true rgw: compression type: random diff --git a/src/rgw/rgw_etag_verifier.h b/src/rgw/rgw_etag_verifier.h index b55f277ed5b..560d54805af 100644 --- a/src/rgw/rgw_etag_verifier.h +++ b/src/rgw/rgw_etag_verifier.h @@ -18,6 +18,12 @@ #include "rgw_putobj.h" #include "rgw_op.h" +enum SourceObjType { + OBJ_TYPE_UNINIT, /* Object type is not initialised yet */ + OBJ_TYPE_ATOMIC, + OBJ_TYPE_MPU, /* Object at source was created through MPU */ +}; + class RGWPutObj_ETagVerifier : public rgw::putobj::Pipe { protected: diff --git a/src/rgw/rgw_rados.cc b/src/rgw/rgw_rados.cc index 3153e41b0fc..acd452ada20 100644 --- a/src/rgw/rgw_rados.cc +++ b/src/rgw/rgw_rados.cc @@ -3259,7 +3259,8 @@ class RGWRadosPutObj : public RGWHTTPStreamRWRequest::ReceiveCB void *progress_data; bufferlist extra_data_bl, manifest_bl; uint64_t extra_data_left{0}; - bool need_to_process_attrs{true}, is_mpu_obj{false}; + bool need_to_process_attrs{true}; + SourceObjType obj_type{OBJ_TYPE_UNINIT}; uint64_t data_len{0}; map src_attrs; uint64_t ofs{0}; @@ -3353,10 +3354,11 @@ public: if (rule.part_size == 0) { /* Atomic object */ + obj_type = OBJ_TYPE_ATOMIC; etag_verifier_atomic = boost::in_place(cct, filter); filter = &*etag_verifier_atomic; } else { - is_mpu_obj = true; + obj_type = OBJ_TYPE_MPU; etag_verifier_mpu = boost::in_place(cct, filter); uint64_t cur_part_ofs = UINT64_MAX; @@ -3444,15 +3446,14 @@ public: } string get_calculated_etag() { - if (!cct->_conf->rgw_sync_obj_etag_verify) - return ""; - - if (is_mpu_obj) { + if (obj_type == OBJ_TYPE_ATOMIC) { + etag_verifier_atomic->calculate_etag(); + return etag_verifier_atomic->get_calculated_etag(); + } else if (obj_type == OBJ_TYPE_MPU) { etag_verifier_mpu->calculate_etag(); return etag_verifier_mpu->get_calculated_etag(); } else { - etag_verifier_atomic->calculate_etag(); - return etag_verifier_atomic->get_calculated_etag(); + return ""; } } };