]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
osd: introduce OpInfo filling from a vector of OSDOps.
authorRadoslaw Zarzynski <rzarzyns@redhat.com>
Wed, 31 Mar 2021 15:28:54 +0000 (15:28 +0000)
committerRadoslaw Zarzynski <rzarzyns@redhat.com>
Mon, 10 May 2021 16:03:55 +0000 (18:03 +0200)
Signed-off-by: Radoslaw Zarzynski <rzarzyns@redhat.com>
src/osd/osd_op_util.cc
src/osd/osd_op_util.h

index 54c590ee2248ee9e842dd2b3ff770e37b14a75a4..a33e2f110d0d4854d3c14e96ac34ac18ff0ca887 100644 (file)
@@ -73,8 +73,6 @@ int OpInfo::set_from_op(
   const MOSDOp *m,
   const OSDMap &osdmap)
 {
-  vector<OSDOp>::const_iterator iter;
-
   // client flags have no bearing on whether an op is a read, write, etc.
   clear();
 
@@ -84,9 +82,18 @@ int OpInfo::set_from_op(
   if (m->has_flag(CEPH_OSD_FLAG_RETURNVEC)) {
     set_returnvec();
   }
+  return set_from_op(m->ops, m->get_pg(), osdmap);
+}
+
+int OpInfo::set_from_op(
+  const std::vector<OSDOp>& ops,
+  const pg_t& pg,
+  const OSDMap &osdmap)
+{
+  vector<OSDOp>::const_iterator iter;
 
   // set bits based on op codes, called methods.
-  for (iter = m->ops.begin(); iter != m->ops.end(); ++iter) {
+  for (iter = ops.begin(); iter != ops.end(); ++iter) {
     if ((iter->op.op == CEPH_OSD_OP_WATCH &&
         iter->op.watch.op == CEPH_OSD_WATCH_OP_PING)) {
       /* This a bit odd.  PING isn't actually a write.  It can't
@@ -116,7 +123,7 @@ int OpInfo::set_from_op(
       set_cache();
 
     // check for ec base pool
-    int64_t poolid = m->get_pg().pool();
+    int64_t poolid = pg.pool();
     const pg_pool_t *pool = osdmap.get_pg_pool(poolid);
     if (pool && pool->is_tier()) {
       const pg_pool_t *base_pool = osdmap.get_pg_pool(pool->tier_of);
@@ -207,12 +214,12 @@ int OpInfo::set_from_op(
       // if we get a delete with FAILOK we can skip handle cache. without
       // FAILOK we still need to promote (or do something smarter) to
       // determine whether to return ENOENT or 0.
-      if (iter == m->ops.begin() &&
+      if (iter == ops.begin() &&
          iter->op.flags == CEPH_OSD_OP_FLAG_FAILOK) {
        set_skip_handle_cache();
       }
       // skip promotion when proxying a delete op
-      if (m->ops.size() == 1) {
+      if (ops.size() == 1) {
        set_skip_promote();
       }
       break;
@@ -221,7 +228,7 @@ int OpInfo::set_from_op(
     case CEPH_OSD_OP_CACHE_FLUSH:
     case CEPH_OSD_OP_CACHE_EVICT:
       // If try_flush/flush/evict is the only op, can skip handle cache.
-      if (m->ops.size() == 1) {
+      if (ops.size() == 1) {
        set_skip_handle_cache();
       }
       break;
@@ -231,7 +238,7 @@ int OpInfo::set_from_op(
     case CEPH_OSD_OP_SPARSE_READ:
     case CEPH_OSD_OP_CHECKSUM:
     case CEPH_OSD_OP_WRITEFULL:
-      if (m->ops.size() == 1 &&
+      if (ops.size() == 1 &&
           (iter->op.flags & CEPH_OSD_OP_FLAG_FADVISE_NOCACHE ||
            iter->op.flags & CEPH_OSD_OP_FLAG_FADVISE_DONTNEED)) {
         set_skip_promote();
index 5fb568e4073643b2d2b61e61e1e246b80f44fba3..300fe40cc87fd66bcfa4462d9f4a01f23d929d8e 100644 (file)
@@ -74,6 +74,10 @@ public:
   int set_from_op(
     const MOSDOp *m,
     const OSDMap &osdmap);
+  int set_from_op(
+    const std::vector<OSDOp> &ops,
+    const pg_t &pg,
+    const OSDMap &osdmap);
 
   std::vector<ClassInfo> get_classes() const {
     return classes;