int create_etag_verifier(CephContext* cct, DataProcessor* filter,
const bufferlist& manifest_bl,
const std::optional<RGWCompressionInfo>& compression,
- boost::optional<ETagVerifier_Atomic>& etag_verifier_atomic,
- boost::optional<ETagVerifier_MPU>& etag_verifier_mpu)
+ etag_verifier_ptr& verifier)
{
RGWObjManifest manifest;
if (rule.part_size == 0) {
/* Atomic object */
- etag_verifier_atomic = boost::in_place(cct, filter);
- filter = &*etag_verifier_atomic;
+ verifier.emplace<ETagVerifier_Atomic>(cct, filter);
return 0;
}
}
}
- etag_verifier_mpu = boost::in_place(cct, std::move(part_ofs), filter);
+ verifier.emplace<ETagVerifier_MPU>(cct, std::move(part_ofs), filter);
return 0;
}
#include "rgw_putobj.h"
#include "rgw_op.h"
+#include "common/static_ptr.h"
namespace rgw::putobj {
}; /* 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<ETagVerifier, max_etag_verifier_size>;
+
+int create_etag_verifier(CephContext* cct, DataProcessor* next,
const bufferlist& manifest_bl,
const std::optional<RGWCompressionInfo>& compression,
- boost::optional<ETagVerifier_Atomic>& etag_verifier_atomic,
- boost::optional<ETagVerifier_MPU>& etag_verifier_mpu);
+ etag_verifier_ptr& verifier);
} // namespace rgw::putobj
rgw::putobj::DataProcessor *filter;
boost::optional<RGWPutObj_Compress>& compressor;
bool try_etag_verify;
- boost::optional<rgw::putobj::ETagVerifier_Atomic> etag_verifier_atomic;
- boost::optional<rgw::putobj::ETagVerifier_MPU> etag_verifier_mpu;
+ rgw::putobj::etag_verifier_ptr etag_verifier;
boost::optional<rgw::putobj::ChunkProcessor> buffering;
CompressorRef& plugin;
rgw::putobj::ObjectProcessor *processor;
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();
}
}
}
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 "";
}