From: Radoslaw Zarzynski Date: Wed, 31 Mar 2021 15:28:54 +0000 (+0000) Subject: osd: introduce OpInfo filling from a vector of OSDOps. X-Git-Tag: v17.1.0~1984^2~9 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=27d5ac3327bcbbd96db12ebdb613f0b04906cb23;p=ceph.git osd: introduce OpInfo filling from a vector of OSDOps. Signed-off-by: Radoslaw Zarzynski --- diff --git a/src/osd/osd_op_util.cc b/src/osd/osd_op_util.cc index 54c590ee2248..a33e2f110d0d 100644 --- a/src/osd/osd_op_util.cc +++ b/src/osd/osd_op_util.cc @@ -73,8 +73,6 @@ int OpInfo::set_from_op( const MOSDOp *m, const OSDMap &osdmap) { - vector::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& ops, + const pg_t& pg, + const OSDMap &osdmap) +{ + vector::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(); diff --git a/src/osd/osd_op_util.h b/src/osd/osd_op_util.h index 5fb568e40736..300fe40cc87f 100644 --- a/src/osd/osd_op_util.h +++ b/src/osd/osd_op_util.h @@ -74,6 +74,10 @@ public: int set_from_op( const MOSDOp *m, const OSDMap &osdmap); + int set_from_op( + const std::vector &ops, + const pg_t &pg, + const OSDMap &osdmap); std::vector get_classes() const { return classes;