]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
osdc: Use boost::container::small_vector for ops vector
authorAdam C. Emerson <aemerson@redhat.com>
Fri, 12 Jul 2019 21:48:02 +0000 (17:48 -0400)
committerAdam C. Emerson <aemerson@redhat.com>
Mon, 4 Nov 2019 20:17:18 +0000 (15:17 -0500)
This way an making an ObjectOperation won't require allocations just
for a few ops.

Signed-off-by: Adam C. Emerson <aemerson@redhat.com>
14 files changed:
src/crimson/osd/osd.h
src/crimson/osd/osd_operations/client_request.h
src/crimson/osd/pg.h
src/crimson/osd/pg_backend.h
src/messages/MOSDOp.h
src/msg/MessageRef.h
src/osd/OSD.h
src/osd/PG.h
src/osd/PrimaryLogPG.h
src/osd/osd_types.cc
src/osd/osd_types.h
src/osdc/Filer.cc
src/osdc/Objecter.cc
src/osdc/Objecter.h

index 843c57e6f733007215c9178b1149a62d01e6c46a..d0beee2fad812bd2a3357391a65c0d3ffb5a163a 100644 (file)
 #include "crimson/osd/pg_map.h"
 #include "crimson/osd/osd_operations/peering_event.h"
 
+#include "messages/MOSDOp.h"
 #include "osd/PeeringState.h"
 #include "osd/osd_types.h"
 #include "osd/osd_perf_counters.h"
 #include "osd/PGPeeringEvent.h"
 
 class MOSDMap;
-class MOSDOp;
 class MOSDRepOpReply;
 class MOSDRepOp;
 class OSDMap;
index 8940194f62f555df4644d4557acdf027c0eee6e8..09658e2bf9da87be095e713909447eb2fa22ecff 100644 (file)
@@ -6,8 +6,7 @@
 #include "crimson/net/Connection.h"
 #include "crimson/osd/osd_operation.h"
 #include "crimson/common/type_helpers.h"
-
-class MOSDOp;
+#include "messages/MOSDOp.h"
 
 namespace crimson::osd {
 class PG;
index 4c5cd11b542d1183399c98d0d10a7f683ec9c5db..ecc2dfd59740398715bc936ec4d3176cb7aa734e 100644 (file)
@@ -13,6 +13,8 @@
 
 #include "common/dout.h"
 #include "crimson/net/Fwd.h"
+#include "messages/MOSDRepOpReply.h"
+#include "messages/MOSDOpReply.h"
 #include "os/Transaction.h"
 #include "osd/osd_types.h"
 #include "osd/osd_internal_types.h"
index b4a7b74a5df44d40853dfb1e72c94beebf2b8ad0..bc8737038031ed8d5aff363644f3d90541e8539e 100644 (file)
 #include "crimson/os/futurized_collection.h"
 #include "crimson/osd/acked_peers.h"
 #include "crimson/common/shared_lru.h"
+#include "messages/MOSDOp.h"
+#include "messages/MOSDOpReply.h"
+#include "os/Transaction.h"
 #include "osd/osd_types.h"
 #include "osd/osd_internal_types.h"
 
 struct hobject_t;
-class MOSDRepOpReply;
 
 namespace ceph::os {
   class Transaction;
index 43bd400546982a7e3b8d0317f5f0783113adbcfa..5301f0a43b255703910ab7743cee16629891011c 100644 (file)
  *
  */
 
-class OSD;
+class MOSDOpReply;
 
+namespace _mosdop {
+template<typename V>
 class MOSDOp : public MOSDFastDispatchOp {
 private:
   static constexpr int HEAD_VERSION = 8;
@@ -54,7 +56,7 @@ private:
   std::atomic<bool> final_decode_needed;
   //
 public:
-  std::vector<OSDOp> ops;
+  V ops;
 private:
   snapid_t snap_seq;
   std::vector<snapid_t> snaps;
@@ -64,7 +66,7 @@ private:
   osd_reqid_t reqid; // reqid explicitly set by sender
 
 public:
-  friend class MOSDOpReply;
+  friend MOSDOpReply;
 
   ceph_tid_t get_client_tid() { return header.tid; }
   void set_snapid(const snapid_t& s) {
@@ -598,6 +600,9 @@ private:
   template<class T, typename... Args>
   friend boost::intrusive_ptr<T> ceph::make_message(Args&&... args);
 };
+}
+
+using MOSDOp = _mosdop::MOSDOp<std::vector<OSDOp>>;
 
 
 #endif
index 5eb3655cb848e1378373f6f5d8f52a2371eb6c4c..4f30f0b352a91f769e514fad8ea9ba0a4c4882b5 100644 (file)
@@ -133,8 +133,6 @@ class MOSDForceRecovery;
 class MOSDFull;
 class MOSDMap;
 class MOSDMarkMeDown;
-class MOSDOp;
-class MOSDOpReply;
 class MOSDPeeringOp;
 class MOSDPGBackfill;
 class MOSDPGBackfillRemove;
index 84e81c95e9ee7415cc2161edb0163c37842903d0..95ebc3a5f9d185ff458a3dd38f9971ba86399a7e 100644 (file)
@@ -91,7 +91,6 @@ struct C_FinishSplits;
 struct C_OpenPGs;
 class LogChannel;
 class CephContext;
-class MOSDOp;
 
 class MOSDPGCreate2;
 class MOSDPGQuery;
index 1ed490a0a9aff310aa29fae82ec45a05509e9636..e372f8896d765704f68cd03259e12dae5901a5e3 100644 (file)
@@ -61,7 +61,6 @@ class OSD;
 class OSDService;
 class OSDShard;
 class OSDShardPGSlot;
-class MOSDOp;
 class MOSDPGScan;
 class MOSDPGBackfill;
 class MOSDPGInfo;
index 5ce1a4e217774beec96ae33b22ee51b29131db9a..e667dfe373881572f5a3384f9c59bc9d19411d69 100644 (file)
@@ -40,8 +40,6 @@ class PrimaryLogPG;
 class PGLSFilter;
 class HitSet;
 struct TierAgentState;
-class MOSDOp;
-class MOSDOpReply;
 class OSDService;
 
 void intrusive_ptr_add_ref(PrimaryLogPG *pg);
index e62071b094c311ddee1d0717711f33ad4160ab4b..70250c12443c4d0e0cb7fecc48d4cb1ae4c9a97c 100644 (file)
@@ -6766,26 +6766,6 @@ ostream& operator<<(ostream& out, const OSDOp& op)
 }
 
 
-void OSDOp::split_osd_op_vector_in_data(vector<OSDOp>& ops, ceph::buffer::list& in)
-{
-  ceph::buffer::list::iterator datap = in.begin();
-  for (unsigned i = 0; i < ops.size(); i++) {
-    if (ops[i].op.payload_len) {
-      datap.copy(ops[i].op.payload_len, ops[i].indata);
-    }
-  }
-}
-
-void OSDOp::merge_osd_op_vector_in_data(vector<OSDOp>& ops, ceph::buffer::list& out)
-{
-  for (unsigned i = 0; i < ops.size(); i++) {
-    if (ops[i].indata.length()) {
-      ops[i].op.payload_len = ops[i].indata.length();
-      out.append(ops[i].indata);
-    }
-  }
-}
-
 void OSDOp::split_osd_op_vector_out_data(vector<OSDOp>& ops, ceph::buffer::list& in)
 {
   auto datap = in.begin();
@@ -6806,35 +6786,6 @@ void OSDOp::merge_osd_op_vector_out_data(vector<OSDOp>& ops, ceph::buffer::list&
   }
 }
 
-void OSDOp::clear_data(vector<OSDOp>& ops)
-{
-  for (unsigned i = 0; i < ops.size(); i++) {
-    OSDOp& op = ops[i];
-    op.outdata.clear();
-    if (ceph_osd_op_type_attr(op.op.op) &&
-        op.op.xattr.name_len &&
-       op.indata.length() >= op.op.xattr.name_len) {
-      ceph::buffer::ptr bp(op.op.xattr.name_len);
-      ceph::buffer::list bl;
-      bl.append(bp);
-      bl.copy_in(0, op.op.xattr.name_len, op.indata);
-      op.indata.claim(bl);
-    } else if (ceph_osd_op_type_exec(op.op.op) &&
-               op.op.cls.class_len &&
-              op.indata.length() >
-                (op.op.cls.class_len + op.op.cls.method_len)) {
-      __u8 len = op.op.cls.class_len + op.op.cls.method_len;
-      ceph::buffer::ptr bp(len);
-      ceph::buffer::list bl;
-      bl.append(bp);
-      bl.copy_in(0, len, op.indata);
-      op.indata.claim(bl);
-    } else {
-      op.indata.clear();
-    }
-  }
-}
-
 int prepare_info_keymap(
   CephContext* cct,
   map<string,bufferlist> *km,
index 713a6b30358f6d4f7ec9e83a4e63a403461eb3c0..6e482ee8dbf9a95ea03b2ef1f9644bd918c51f9d 100644 (file)
@@ -3949,7 +3949,16 @@ struct OSDOp {
    * @param ops [out] vector of OSDOps
    * @param in  [in] combined data buffer
    */
-  static void split_osd_op_vector_in_data(std::vector<OSDOp>& ops, ceph::buffer::list& in);
+  template<typename V>
+  static void split_osd_op_vector_in_data(V& ops,
+                                         ceph::buffer::list& in) {
+    ceph::buffer::list::iterator datap = in.begin();
+    for (unsigned i = 0; i < ops.size(); i++) {
+      if (ops[i].op.payload_len) {
+       datap.copy(ops[i].op.payload_len, ops[i].indata);
+      }
+    }
+  }
 
   /**
    * merge indata members of a vector of OSDOp into a single ceph::buffer::list
@@ -3960,7 +3969,15 @@ struct OSDOp {
    * @param ops [in] vector of OSDOps
    * @param out [out] combined data buffer
    */
-  static void merge_osd_op_vector_in_data(std::vector<OSDOp>& ops, ceph::buffer::list& out);
+  template<typename V>
+  static void merge_osd_op_vector_in_data(V& ops, ceph::buffer::list& out) {
+    for (unsigned i = 0; i < ops.size(); i++) {
+      if (ops[i].indata.length()) {
+       ops[i].op.payload_len = ops[i].indata.length();
+       out.append(ops[i].indata);
+      }
+    }
+  }
 
   /**
    * split a ceph::buffer::list into constituent outdata members of a vector of OSDOps
@@ -3983,11 +4000,37 @@ struct OSDOp {
    *
    * @param ops [in] vector of OSDOps
    */
-  static void clear_data(std::vector<OSDOp>& ops);
+  template<typename V>
+  static void clear_data(V& ops) {
+    for (unsigned i = 0; i < ops.size(); i++) {
+      OSDOp& op = ops[i];
+      op.outdata.clear();
+      if (ceph_osd_op_type_attr(op.op.op) &&
+         op.op.xattr.name_len &&
+         op.indata.length() >= op.op.xattr.name_len) {
+       ceph::buffer::ptr bp(op.op.xattr.name_len);
+       ceph::buffer::list bl;
+       bl.append(bp);
+       bl.copy_in(0, op.op.xattr.name_len, op.indata);
+       op.indata.claim(bl);
+      } else if (ceph_osd_op_type_exec(op.op.op) &&
+                op.op.cls.class_len &&
+                op.indata.length() >
+                (op.op.cls.class_len + op.op.cls.method_len)) {
+       __u8 len = op.op.cls.class_len + op.op.cls.method_len;
+       ceph::buffer::ptr bp(len);
+       ceph::buffer::list bl;
+       bl.append(bp);
+       bl.copy_in(0, len, op.indata);
+       op.indata.claim(bl);
+      } else {
+       op.indata.clear();
+      }
+    }
+  }
 };
 std::ostream& operator<<(std::ostream& out, const OSDOp& op);
 
-
 struct pg_log_op_return_item_t {
   int32_t rval;
   bufferlist bl;
index 83370d8c08bd6c2b69e68c6eda26e39dcdbac19b..4a2aeb8807784a0079aec11fc35942f526a12da8 100644 (file)
@@ -415,7 +415,7 @@ void Filer::truncate(inodeno_t ino,
   if (num_objs == 1) {
     vector<ObjectExtent> extents;
     Striper::file_to_extents(cct, ino, layout, offset, len, 0, extents);
-    vector<OSDOp> ops(1);
+    osdc_opvec ops(1);
     ops[0].op.op = CEPH_OSD_OP_TRIMTRUNC;
     ops[0].op.extent.truncate_seq = truncate_seq;
     ops[0].op.extent.truncate_size = extents[0].offset;
@@ -474,7 +474,7 @@ void Filer::_do_truncate_range(TruncRange *tr, int fin)
 
   // Issue objecter ops outside tr->lock to avoid lock dependency loop
   for (const auto& p : extents) {
-    vector<OSDOp> ops(1);
+    osdc_opvec ops(1);
     ops[0].op.op = CEPH_OSD_OP_TRIMTRUNC;
     ops[0].op.extent.truncate_size = p.offset;
     ops[0].op.extent.truncate_seq = tr->truncate_seq;
index d8457f811f8bc388ce7b431e72396d5c723c401f..f1c9552fb57470667b13543056c1b46adbfee2ad 100644 (file)
@@ -522,9 +522,8 @@ void Objecter::_send_linger(LingerOp *info,
                            ceph::shunique_lock<ceph::shared_mutex>& sul)
 {
   ceph_assert(sul.owns_lock() && sul.mutex() == &rwlock);
-
-  vector<OSDOp> opv;
   std::unique_ptr<Op::OpComp> oncommit;
+  osdc_opvec opv;
   std::shared_lock watchl(info->watch_lock);
   cb::list *poutbl = nullptr;
   if (info->registered && info->is_watch) {
@@ -689,7 +688,7 @@ void Objecter::_send_linger_ping(LingerOp *info)
   ldout(cct, 10) << __func__ << " " << info->linger_id << " now " << now
                 << dendl;
 
-  vector<OSDOp> opv(1);
+  osdc_opvec opv(1);
   opv[0].op.op = CEPH_OSD_OP_WATCH;
   opv[0].op.watch.cookie = info->get_cookie();
   opv[0].op.watch.op = CEPH_OSD_WATCH_OP_PING;
@@ -3122,7 +3121,7 @@ void Objecter::_finish_op(Op *op, int r)
   op->put();
 }
 
-MOSDOp *Objecter::_prepare_osd_op(Op *op)
+Objecter::MOSDOp *Objecter::_prepare_osd_op(Op *op)
 {
   // rwlock is locked
 
@@ -3249,12 +3248,10 @@ void Objecter::_send_op(Op *op)
   op->session->con->send_message(m);
 }
 
-int Objecter::calc_op_budget(const vector<OSDOp>& ops)
+int Objecter::calc_op_budget(const bc::small_vector_base<OSDOp>& ops)
 {
   int op_budget = 0;
-  for (vector<OSDOp>::const_iterator i = ops.begin();
-       i != ops.end();
-       ++i) {
+  for (auto i = ops.begin(); i != ops.end(); ++i) {
     if (i->op.op & CEPH_OSD_OP_MODE_WR) {
       op_budget += i->indata.length();
     } else if (ceph_osd_op_mode_read(i->op.op)) {
index 467aa894352caeb637de570e7936b61f2c60e798..6a1a9fdf9c7e5ebc35aefba491f6d5082ab437e4 100644 (file)
@@ -25,6 +25,7 @@
 #include <string_view>
 #include <type_traits>
 
+#include <boost/container/small_vector.hpp>
 #include <boost/asio.hpp>
 
 #include "include/buffer.h"
@@ -67,19 +68,25 @@ class MWatchNotify;
 class PerfCounters;
 struct EnumerationContext;
 
+inline constexpr std::size_t osdc_opvec_len = 4;
+using osdc_opvec = boost::container::small_vector<OSDOp, osdc_opvec_len>;
+
 
 // -----------------------------------------
 
 struct ObjectOperation {
-  std::vector<OSDOp> ops;
+  osdc_opvec ops;
   int flags = 0;
   int priority = 0;
 
-  std::vector<ceph::buffer::list*> out_bl;
-  std::vector<fu2::unique_function<void(boost::system::error_code, int,
-                                       const ceph::buffer::list& bl) &&>> out_handler;
-  std::vector<int*> out_rval;
-  std::vector<boost::system::error_code*> out_ec;
+  boost::container::small_vector<ceph::buffer::list*, osdc_opvec_len> out_bl;
+  boost::container::small_vector<
+    fu2::unique_function<void(boost::system::error_code, int,
+                             const ceph::buffer::list& bl) &&>,
+    osdc_opvec_len> out_handler;
+  boost::container::small_vector<int*, osdc_opvec_len> out_rval;
+  boost::container::small_vector<boost::system::error_code*,
+                                osdc_opvec_len> out_ec;
 
   ObjectOperation() = default;
   ObjectOperation(const ObjectOperation&) = delete;
@@ -1451,8 +1458,11 @@ struct ObjectOperation {
     set_last_op_flags(CEPH_OSD_OP_FLAG_FAILOK);
   }
 
-  void dup(std::vector<OSDOp>& sops) {
-    ops = sops;
+  template<typename V>
+  void dup(V& sops) {
+    ops.clear();
+    std::copy(sops.begin(), sops.end(),
+             std::back_inserter(ops));
     out_bl.resize(sops.size());
     out_handler.resize(sops.size());
     out_rval.resize(sops.size());
@@ -1493,6 +1503,7 @@ inline std::ostream& operator <<(std::ostream& m, const ObjectOperation& oo) {
 // ----------------
 
 class Objecter : public md_config_obs_t, public Dispatcher {
+  using MOSDOp = _mosdop::MOSDOp<osdc_opvec>;
 public:
   using OpSignature = void(boost::system::error_code);
   using OpCompletion = ceph::async::Completion<OpSignature>;
@@ -1754,18 +1765,21 @@ public:
     ConnectionRef con = nullptr;  // for rx buffer only
     uint64_t features = CEPH_FEATURES_SUPPORTED_DEFAULT; // explicitly specified op features
 
-    std::vector<OSDOp> ops;
+    osdc_opvec ops;
 
     snapid_t snapid = CEPH_NOSNAP;
     SnapContext snapc;
     ceph::real_time mtime;
 
     ceph::buffer::list *outbl = nullptr;
-    std::vector<ceph::buffer::list*> out_bl;
-    std::vector<fu2::unique_function<void(boost::system::error_code, int,
-                                         const ceph::buffer::list& bl) &&>> out_handler;
-    std::vector<int*> out_rval;
-    std::vector<boost::system::error_code*> out_ec;
+    boost::container::small_vector<ceph::buffer::list*, osdc_opvec_len> out_bl;
+    boost::container::small_vector<
+      fu2::unique_function<void(boost::system::error_code, int,
+                               const ceph::buffer::list& bl) &&>,
+      osdc_opvec_len> out_handler;
+    boost::container::small_vector<int*, osdc_opvec_len> out_rval;
+    boost::container::small_vector<boost::system::error_code*,
+                                  osdc_opvec_len> out_ec;
 
     int priority = 0;
     using OpSig = void(boost::system::error_code);
@@ -1827,7 +1841,7 @@ public:
       complete(std::move(onfinish), ec, r);
     }
 
-    Op(const object_t& o, const object_locator_t& ol, vector<OSDOp>&& _ops,
+    Op(const object_t& o, const object_locator_t& ol,  osdc_opvec&& _ops,
        int f, std::unique_ptr<OpComp>&& fin,
        version_t *ov, int *offset = nullptr,
        ZTracer::Trace *parent_trace = nullptr) :
@@ -1847,7 +1861,8 @@ public:
         trace.event("start");
       }
     }
-    Op(const object_t& o, const object_locator_t& ol, vector<OSDOp>&& _ops,
+
+    Op(const object_t& o, const object_locator_t& ol, osdc_opvec&& _ops,
        int f, Context* fin, version_t *ov, int *offset = nullptr,
        ZTracer::Trace *parent_trace = nullptr) :
       target(o, ol, f),
@@ -2099,7 +2114,7 @@ public:
     SnapContext snapc;
     ceph::real_time mtime;
 
-    std::vector<OSDOp> ops;
+    osdc_opvec ops;
     ceph::buffer::list inbl;
     version_t *pobjver{nullptr};
 
@@ -2386,7 +2401,7 @@ private:
    * and returned whenever an op is removed from the std::map
    * If throttle_op needs to throttle it will unlock client_lock.
    */
-  int calc_op_budget(const std::vector<OSDOp>& ops);
+  int calc_op_budget(const boost::container::small_vector_base<OSDOp>& ops);
   void _throttle_op(Op *op, ceph::shunique_lock<ceph::shared_mutex>& sul,
                    int op_size = 0);
   int _take_op_budget(Op *op, ceph::shunique_lock<ceph::shared_mutex>& sul) {
@@ -2789,7 +2804,7 @@ public:
     o->priority = op.priority;
     o->snapid = snapid;
     o->outbl = pbl;
-    if (!o->outbl && op.size() == 1 && op.out_bl[0]->length())
+    if (!o->outbl && op.size() == 1 && op.out_bl[0] && op.out_bl[0]->length())
        o->outbl = op.out_bl[0];
     o->out_bl.swap(op.out_bl);
     o->out_handler.swap(op.out_handler);
@@ -2825,8 +2840,10 @@ public:
     o->priority = op.priority;
     o->snapid = snapid;
     o->outbl = pbl;
-    if (!o->outbl && op.size() == 1 && op.out_bl[0]->length())
-       o->outbl = op.out_bl[0];
+    // XXX
+    if (!o->outbl && op.size() == 1 && op.out_bl[0] && op.out_bl[0]->length()) {
+      o->outbl = op.out_bl[0];
+    }
     o->out_bl.swap(op.out_bl);
     o->out_handler.swap(op.out_handler);
     o->out_rval.swap(op.out_rval);
@@ -2956,7 +2973,8 @@ public:
    * @param extra_ops pointer to [array of] initial op[s]
    * @return index of final op (for caller to fill in)
    */
-  int init_ops(std::vector<OSDOp>& ops, int ops_count, ObjectOperation *extra_ops) {
+  int init_ops(boost::container::small_vector_base<OSDOp>& ops, int ops_count,
+              ObjectOperation *extra_ops) {
     int i;
     int extra = 0;
 
@@ -2979,7 +2997,7 @@ public:
     snapid_t snap, uint64_t *psize, ceph::real_time *pmtime,
     int flags, Context *onfinish, version_t *objver = NULL,
     ObjectOperation *extra_ops = NULL) {
-    std::vector<OSDOp> ops;
+    osdc_opvec ops;
     int i = init_ops(ops, 1, extra_ops);
     ops[i].op.op = CEPH_OSD_OP_STAT;
     C_Stat *fin = new C_Stat(psize, pmtime, onfinish);
@@ -3007,7 +3025,7 @@ public:
     int flags, Context *onfinish, version_t *objver = NULL,
     ObjectOperation *extra_ops = NULL, int op_flags = 0,
     ZTracer::Trace *parent_trace = nullptr) {
-    std::vector<OSDOp> ops;
+    osdc_opvec ops;
     int i = init_ops(ops, 1, extra_ops);
     ops[i].op.op = CEPH_OSD_OP_READ;
     ops[i].op.extent.offset = off;
@@ -3039,7 +3057,7 @@ public:
     uint64_t off, ceph::buffer::list &cmp_bl,
     snapid_t snap, int flags, Context *onfinish, version_t *objver = NULL,
     ObjectOperation *extra_ops = NULL, int op_flags = 0) {
-    std::vector<OSDOp> ops;
+    osdc_opvec ops;
     int i = init_ops(ops, 1, extra_ops);
     ops[i].op.op = CEPH_OSD_OP_CMPEXT;
     ops[i].op.extent.offset = off;
@@ -3072,7 +3090,7 @@ public:
                        __u32 trunc_seq, Context *onfinish,
                        version_t *objver = NULL,
                        ObjectOperation *extra_ops = NULL, int op_flags = 0) {
-    std::vector<OSDOp> ops;
+    osdc_opvec ops;
     int i = init_ops(ops, 1, extra_ops);
     ops[i].op.op = CEPH_OSD_OP_READ;
     ops[i].op.extent.offset = off;
@@ -3092,7 +3110,7 @@ public:
                    uint64_t off, uint64_t len, snapid_t snap, ceph::buffer::list *pbl,
                    int flags, Context *onfinish, version_t *objver = NULL,
                    ObjectOperation *extra_ops = NULL) {
-    std::vector<OSDOp> ops;
+    osdc_opvec ops;
     int i = init_ops(ops, 1, extra_ops);
     ops[i].op.op = CEPH_OSD_OP_MAPEXT;
     ops[i].op.extent.offset = off;
@@ -3111,7 +3129,7 @@ public:
             const char *name, snapid_t snap, ceph::buffer::list *pbl, int flags,
             Context *onfinish,
             version_t *objver = NULL, ObjectOperation *extra_ops = NULL) {
-    std::vector<OSDOp> ops;
+    osdc_opvec ops;
     int i = init_ops(ops, 1, extra_ops);
     ops[i].op.op = CEPH_OSD_OP_GETXATTR;
     ops[i].op.xattr.name_len = (name ? strlen(name) : 0);
@@ -3131,7 +3149,7 @@ public:
                       snapid_t snap, std::map<std::string,ceph::buffer::list>& attrset,
                       int flags, Context *onfinish, version_t *objver = NULL,
                       ObjectOperation *extra_ops = NULL) {
-    std::vector<OSDOp> ops;
+    osdc_opvec ops;
     int i = init_ops(ops, 1, extra_ops);
     ops[i].op.op = CEPH_OSD_OP_GETXATTRS;
     C_GetAttrs *fin = new C_GetAttrs(attrset, onfinish);
@@ -3155,7 +3173,8 @@ public:
 
   // writes
   ceph_tid_t _modify(const object_t& oid, const object_locator_t& oloc,
-                    std::vector<OSDOp>& ops, ceph::real_time mtime,
+                    osdc_opvec& ops,
+                    ceph::real_time mtime,
                     const SnapContext& snapc, int flags,
                     Context *oncommit,
                     version_t *objver = NULL) {
@@ -3174,7 +3193,7 @@ public:
     Context *oncommit, version_t *objver = NULL,
     ObjectOperation *extra_ops = NULL, int op_flags = 0,
     ZTracer::Trace *parent_trace = nullptr) {
-    std::vector<OSDOp> ops;
+    osdc_opvec ops;
     int i = init_ops(ops, 1, extra_ops);
     ops[i].op.op = CEPH_OSD_OP_WRITE;
     ops[i].op.extent.offset = off;
@@ -3209,7 +3228,7 @@ public:
     Context *oncommit,
     version_t *objver = NULL,
     ObjectOperation *extra_ops = NULL) {
-    std::vector<OSDOp> ops;
+    osdc_opvec ops;
     int i = init_ops(ops, 1, extra_ops);
     ops[i].op.op = CEPH_OSD_OP_APPEND;
     ops[i].op.extent.offset = 0;
@@ -3243,7 +3262,7 @@ public:
                         Context *oncommit,
                         version_t *objver = NULL,
                         ObjectOperation *extra_ops = NULL, int op_flags = 0) {
-    std::vector<OSDOp> ops;
+    osdc_opvec ops;
     int i = init_ops(ops, 1, extra_ops);
     ops[i].op.op = CEPH_OSD_OP_WRITE;
     ops[i].op.extent.offset = off;
@@ -3266,7 +3285,7 @@ public:
     ceph::real_time mtime, int flags,
     Context *oncommit, version_t *objver = NULL,
     ObjectOperation *extra_ops = NULL, int op_flags = 0) {
-    std::vector<OSDOp> ops;
+    osdc_opvec ops;
     int i = init_ops(ops, 1, extra_ops);
     ops[i].op.op = CEPH_OSD_OP_WRITEFULL;
     ops[i].op.extent.offset = 0;
@@ -3299,7 +3318,7 @@ public:
     Context *oncommit, version_t *objver = NULL,
     ObjectOperation *extra_ops = NULL, int op_flags = 0) {
 
-    std::vector<OSDOp> ops;
+    osdc_opvec ops;
     int i = init_ops(ops, 1, extra_ops);
     ops[i].op.op = CEPH_OSD_OP_WRITESAME;
     ops[i].op.writesame.offset = off;
@@ -3334,7 +3353,7 @@ public:
                   uint64_t trunc_size, __u32 trunc_seq,
                   Context *oncommit, version_t *objver = NULL,
                   ObjectOperation *extra_ops = NULL) {
-    std::vector<OSDOp> ops;
+    osdc_opvec ops;
     int i = init_ops(ops, 1, extra_ops);
     ops[i].op.op = CEPH_OSD_OP_TRUNCATE;
     ops[i].op.extent.offset = trunc_size;
@@ -3352,7 +3371,7 @@ public:
                  uint64_t off, uint64_t len, const SnapContext& snapc,
                  ceph::real_time mtime, int flags, Context *oncommit,
             version_t *objver = NULL, ObjectOperation *extra_ops = NULL) {
-    std::vector<OSDOp> ops;
+    osdc_opvec ops;
     int i = init_ops(ops, 1, extra_ops);
     ops[i].op.op = CEPH_OSD_OP_ZERO;
     ops[i].op.extent.offset = off;
@@ -3370,7 +3389,7 @@ public:
                             ceph::real_time mtime, Context *oncommit,
                             version_t *objver = NULL,
                             ObjectOperation *extra_ops = NULL) {
-    std::vector<OSDOp> ops;
+    osdc_opvec ops;
     int i = init_ops(ops, 1, extra_ops);
     ops[i].op.op = CEPH_OSD_OP_ROLLBACK;
     ops[i].op.snap.snapid = snapid;
@@ -3386,7 +3405,7 @@ public:
                    int create_flags, Context *oncommit,
                    version_t *objver = NULL,
                    ObjectOperation *extra_ops = NULL) {
-    std::vector<OSDOp> ops;
+    osdc_opvec ops;
     int i = init_ops(ops, 1, extra_ops);
     ops[i].op.op = CEPH_OSD_OP_CREATE;
     ops[i].op.flags = create_flags;
@@ -3403,7 +3422,7 @@ public:
     const SnapContext& snapc, ceph::real_time mtime, int flags,
     Context *oncommit,
     version_t *objver = NULL, ObjectOperation *extra_ops = NULL) {
-    std::vector<OSDOp> ops;
+    osdc_opvec ops;
     int i = init_ops(ops, 1, extra_ops);
     ops[i].op.op = CEPH_OSD_OP_DELETE;
     Op *o = new Op(oid, oloc, std::move(ops), flags | global_op_flags |
@@ -3429,7 +3448,7 @@ public:
              ceph::real_time mtime, int flags,
              Context *oncommit,
              version_t *objver = NULL, ObjectOperation *extra_ops = NULL) {
-    std::vector<OSDOp> ops;
+    osdc_opvec ops;
     int i = init_ops(ops, 1, extra_ops);
     ops[i].op.op = CEPH_OSD_OP_SETXATTR;
     ops[i].op.xattr.name_len = (name ? strlen(name) : 0);
@@ -3451,7 +3470,7 @@ public:
              ceph::real_time mtime, int flags,
              Context *oncommit,
              version_t *objver = NULL, ObjectOperation *extra_ops = NULL) {
-    std::vector<OSDOp> ops;
+    osdc_opvec ops;
     int i = init_ops(ops, 1, extra_ops);
     ops[i].op.op = CEPH_OSD_OP_RMXATTR;
     ops[i].op.xattr.name_len = (name ? strlen(name) : 0);