From: Casey Bodley Date: Fri, 18 Sep 2020 14:10:50 +0000 (-0400) Subject: rgw: use static_ptr for etag verifiers X-Git-Tag: v17.0.0~977^2 X-Git-Url: http://git.apps.os.sepia.ceph.com/?a=commitdiff_plain;h=45a060612ec376110b84c2a2b7783c8a6aee191c;p=ceph.git rgw: use static_ptr for etag verifiers Signed-off-by: Casey Bodley --- diff --git a/src/rgw/rgw_etag_verifier.cc b/src/rgw/rgw_etag_verifier.cc index f251684231d6f..05aedb12fc18b 100644 --- a/src/rgw/rgw_etag_verifier.cc +++ b/src/rgw/rgw_etag_verifier.cc @@ -10,8 +10,7 @@ namespace rgw::putobj { int create_etag_verifier(CephContext* cct, DataProcessor* filter, const bufferlist& manifest_bl, const std::optional& compression, - boost::optional& etag_verifier_atomic, - boost::optional& etag_verifier_mpu) + etag_verifier_ptr& verifier) { RGWObjManifest manifest; @@ -32,8 +31,7 @@ int create_etag_verifier(CephContext* cct, DataProcessor* filter, if (rule.part_size == 0) { /* Atomic object */ - etag_verifier_atomic = boost::in_place(cct, filter); - filter = &*etag_verifier_atomic; + verifier.emplace(cct, filter); return 0; } @@ -75,7 +73,7 @@ int create_etag_verifier(CephContext* cct, DataProcessor* filter, } } - etag_verifier_mpu = boost::in_place(cct, std::move(part_ofs), filter); + verifier.emplace(cct, std::move(part_ofs), filter); return 0; } diff --git a/src/rgw/rgw_etag_verifier.h b/src/rgw/rgw_etag_verifier.h index db0f1d9518fd9..dac6ddab5f800 100644 --- a/src/rgw/rgw_etag_verifier.h +++ b/src/rgw/rgw_etag_verifier.h @@ -17,6 +17,7 @@ #include "rgw_putobj.h" #include "rgw_op.h" +#include "common/static_ptr.h" namespace rgw::putobj { @@ -68,11 +69,16 @@ public: }; /* ETagVerifier_MPU */ -int create_etag_verifier(CephContext* cct, DataProcessor* filter, +constexpr auto max_etag_verifier_size = std::max( + sizeof(ETagVerifier_Atomic), + sizeof(ETagVerifier_MPU) + ); +using etag_verifier_ptr = ceph::static_ptr; + +int create_etag_verifier(CephContext* cct, DataProcessor* next, const bufferlist& manifest_bl, const std::optional& compression, - boost::optional& etag_verifier_atomic, - boost::optional& etag_verifier_mpu); + etag_verifier_ptr& verifier); } // namespace rgw::putobj diff --git a/src/rgw/rgw_rados.cc b/src/rgw/rgw_rados.cc index 278b2af0f2dfb..eca24960fc4e1 100644 --- a/src/rgw/rgw_rados.cc +++ b/src/rgw/rgw_rados.cc @@ -3284,8 +3284,7 @@ class RGWRadosPutObj : public RGWHTTPStreamRWRequest::ReceiveCB rgw::putobj::DataProcessor *filter; boost::optional& compressor; bool try_etag_verify; - boost::optional etag_verifier_atomic; - boost::optional etag_verifier_mpu; + rgw::putobj::etag_verifier_ptr etag_verifier; boost::optional buffering; CompressorRef& plugin; rgw::putobj::ObjectProcessor *processor; @@ -3389,15 +3388,12 @@ public: if (try_etag_verify && src_attrs.find(RGW_ATTR_CRYPT_MODE) == src_attrs.end()) { ret = rgw::putobj::create_etag_verifier(cct, filter, manifest_bl, compression_info, - etag_verifier_atomic, - etag_verifier_mpu); + etag_verifier); if (ret < 0) { ldout(cct, 4) << "failed to initial etag verifier, " "disabling etag verification" << dendl; - } else if (etag_verifier_atomic) { - filter = &*etag_verifier_atomic; - } else if (etag_verifier_mpu) { - filter = &*etag_verifier_mpu; + } else { + filter = etag_verifier.get(); } } @@ -3469,12 +3465,9 @@ public: } std::string get_verifier_etag() { - if (etag_verifier_atomic) { - etag_verifier_atomic->calculate_etag(); - return etag_verifier_atomic->get_calculated_etag(); - } else if (etag_verifier_mpu) { - etag_verifier_mpu->calculate_etag(); - return etag_verifier_mpu->get_calculated_etag(); + if (etag_verifier) { + etag_verifier->calculate_etag(); + return etag_verifier->get_calculated_etag(); } else { return ""; }