]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
rgw: use static_ptr for etag verifiers 37238/head
authorCasey Bodley <cbodley@redhat.com>
Fri, 18 Sep 2020 14:10:50 +0000 (10:10 -0400)
committerCasey Bodley <cbodley@redhat.com>
Tue, 22 Sep 2020 18:40:36 +0000 (14:40 -0400)
Signed-off-by: Casey Bodley <cbodley@redhat.com>
src/rgw/rgw_etag_verifier.cc
src/rgw/rgw_etag_verifier.h
src/rgw/rgw_rados.cc

index f251684231d6f88d32a97d7f8f03c07920f2e340..05aedb12fc18b603f89cfb40e0a57989ebc5c7d6 100644 (file)
@@ -10,8 +10,7 @@ namespace rgw::putobj {
 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;
 
@@ -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<ETagVerifier_Atomic>(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<ETagVerifier_MPU>(cct, std::move(part_ofs), filter);
   return 0;
 }
 
index db0f1d9518fd97a0d0610c5b54129b6a860fd510..dac6ddab5f800a12a88d3f7354b2b3be1938be22 100644 (file)
@@ -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<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
 
index 278b2af0f2dfb9b32b30a250d02281cc4fce2f4d..eca24960fc4e1cba7e76f7fc8d4693ba54032e8c 100644 (file)
@@ -3284,8 +3284,7 @@ class RGWRadosPutObj : public RGWHTTPStreamRWRequest::ReceiveCB
   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;
@@ -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 "";
     }