From: Jianpeng Ma Date: Tue, 9 Jun 2015 06:14:31 +0000 (+0800) Subject: osd: add bool supports_omap() in pg_pool_t. X-Git-Tag: v9.0.3~57^2~1 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=1ffced35eb3c29938dbea1446f5d372ef1ec2693;p=ceph.git osd: add bool supports_omap() in pg_pool_t. Using this func judge pg whether support omap operations. Signed-off-by: Jianpeng Ma --- diff --git a/src/osd/ReplicatedPG.cc b/src/osd/ReplicatedPG.cc index 7bcce73ecaa..9b3f2b8dc83 100644 --- a/src/osd/ReplicatedPG.cc +++ b/src/osd/ReplicatedPG.cc @@ -4722,7 +4722,7 @@ int ReplicatedPG::do_osd_ops(OpContext *ctx, vector& ops) tracepoint(osd, do_osd_op_pre_omapgetkeys, soid.oid.name.c_str(), soid.snap.val, start_after.c_str(), max_return); set out_set; - if (!pool.info.require_rollback()) { + if (pool.info.supports_omap()) { ObjectMap::ObjectMapIterator iter = osd->store->get_omap_iterator( coll, soid ); @@ -4759,7 +4759,7 @@ int ReplicatedPG::do_osd_ops(OpContext *ctx, vector& ops) tracepoint(osd, do_osd_op_pre_omapgetvals, soid.oid.name.c_str(), soid.snap.val, start_after.c_str(), max_return, filter_prefix.c_str()); map out_set; - if (!pool.info.require_rollback()) { + if (pool.info.supports_omap()) { ObjectMap::ObjectMapIterator iter = osd->store->get_omap_iterator( coll, soid ); @@ -4785,7 +4785,7 @@ int ReplicatedPG::do_osd_ops(OpContext *ctx, vector& ops) case CEPH_OSD_OP_OMAPGETHEADER: tracepoint(osd, do_osd_op_pre_omapgetheader, soid.oid.name.c_str(), soid.snap.val); - if (pool.info.require_rollback()) { + if (!pool.info.supports_omap()) { // return empty header break; } @@ -4811,7 +4811,7 @@ int ReplicatedPG::do_osd_ops(OpContext *ctx, vector& ops) } tracepoint(osd, do_osd_op_pre_omapgetvalsbykeys, soid.oid.name.c_str(), soid.snap.val, list_entries(keys_to_get).c_str()); map out; - if (!pool.info.require_rollback()) { + if (pool.info.supports_omap()) { osd->store->omap_get_values(coll, soid, keys_to_get, &out); } // else return empty omap entries ::encode(out, osd_op.outdata); @@ -4841,7 +4841,7 @@ int ReplicatedPG::do_osd_ops(OpContext *ctx, vector& ops) map out; - if (!pool.info.require_rollback()) { + if (pool.info.supports_omap()) { set to_get; for (map >::iterator i = assertions.begin(); i != assertions.end(); @@ -4895,7 +4895,7 @@ int ReplicatedPG::do_osd_ops(OpContext *ctx, vector& ops) // OMAP Write ops case CEPH_OSD_OP_OMAPSETVALS: - if (pool.info.require_rollback()) { + if (!pool.info.supports_omap()) { result = -EOPNOTSUPP; tracepoint(osd, do_osd_op_pre_omapsetvals, soid.oid.name.c_str(), soid.snap.val, "???"); break; @@ -4931,7 +4931,7 @@ int ReplicatedPG::do_osd_ops(OpContext *ctx, vector& ops) case CEPH_OSD_OP_OMAPSETHEADER: tracepoint(osd, do_osd_op_pre_omapsetheader, soid.oid.name.c_str(), soid.snap.val); - if (pool.info.require_rollback()) { + if (!pool.info.supports_omap()) { result = -EOPNOTSUPP; break; } @@ -4952,7 +4952,7 @@ int ReplicatedPG::do_osd_ops(OpContext *ctx, vector& ops) case CEPH_OSD_OP_OMAPCLEAR: tracepoint(osd, do_osd_op_pre_omapclear, soid.oid.name.c_str(), soid.snap.val); - if (pool.info.require_rollback()) { + if (!pool.info.supports_omap()) { result = -EOPNOTSUPP; break; } @@ -4972,7 +4972,7 @@ int ReplicatedPG::do_osd_ops(OpContext *ctx, vector& ops) break; case CEPH_OSD_OP_OMAPRMKEYS: - if (pool.info.require_rollback()) { + if (!pool.info.supports_omap()) { result = -EOPNOTSUPP; tracepoint(osd, do_osd_op_pre_omaprmkeys, soid.oid.name.c_str(), soid.snap.val, "???"); break; @@ -6087,7 +6087,7 @@ int ReplicatedPG::fill_in_copy_get( // omap uint32_t omap_keys = 0; - if (pool.info.require_rollback()) { + if (!pool.info.supports_omap()) { cursor.omap_complete = true; } else { if (left > 0 && !cursor.omap_complete) { @@ -6222,7 +6222,7 @@ void ReplicatedPG::_copy_some(ObjectContextRef obc, CopyOpRef cop) } uint32_t copyget_flags = 0; - if (pool.info.require_rollback()) + if (!pool.info.supports_omap()) copyget_flags |= CEPH_OSD_COPY_GET_FLAG_NOTSUPP_OMAP; op.copy_get(&cop->cursor, get_copy_chunk_size(), copyget_flags, @@ -6271,7 +6271,7 @@ void ReplicatedPG::process_copy_chunk(hobject_t oid, ceph_tid_t tid, int r) if (cop->omap_data.length() || cop->omap_header.length()) cop->results.has_omap = true; - if (r >= 0 && pool.info.require_rollback() && + if (r >= 0 && !pool.info.supports_omap() && (cop->omap_data.length() || cop->omap_header.length())) { r = -EOPNOTSUPP; } @@ -6451,7 +6451,7 @@ void ReplicatedPG::_write_copy_chunk(CopyOpRef cop, PGBackend::PGTransaction *t) cop->dest_obj_fadvise_flags); cop->data.clear(); } - if (!pool.info.require_rollback()) { + if (pool.info.supports_omap()) { if (!cop->temp_cursor.omap_complete) { if (cop->omap_header.length()) { cop->results.omap_digest = @@ -10656,7 +10656,7 @@ bool ReplicatedPG::agent_work(int start_max) } // be careful flushing omap to an EC pool. - if (base_pool->is_erasure() && + if (!base_pool->supports_omap() && obc->obs.oi.test_flag(object_info_t::FLAG_OMAP)) { dout(20) << __func__ << " skip (omap to EC) " << obc->obs.oi << dendl; osd->logger->inc(l_osd_agent_skip); @@ -10994,7 +10994,7 @@ bool ReplicatedPG::agent_choose_mode(bool restart, OpRequestRef op) // also exclude omap objects if ec backing pool const pg_pool_t *base_pool = get_osdmap()->get_pg_pool(pool.info.tier_of); assert(base_pool); - if (base_pool->is_erasure()) + if (!base_pool->supports_omap()) unflushable += info.stats.stats.sum.num_objects_omap; uint64_t num_user_objects = info.stats.stats.sum.num_objects; @@ -11009,7 +11009,7 @@ bool ReplicatedPG::agent_choose_mode(bool restart, OpRequestRef op) // also reduce the num_dirty by num_objects_omap int64_t num_dirty = info.stats.stats.sum.num_objects_dirty; - if (base_pool->is_erasure()) { + if (!base_pool->supports_omap()) { if (num_dirty > info.stats.stats.sum.num_objects_omap) num_dirty -= info.stats.stats.sum.num_objects_omap; else diff --git a/src/osd/osd_types.h b/src/osd/osd_types.h index 09d67f210f4..f70c6bc29a5 100644 --- a/src/osd/osd_types.h +++ b/src/osd/osd_types.h @@ -1092,6 +1092,10 @@ public: bool is_replicated() const { return get_type() == TYPE_REPLICATED; } bool is_erasure() const { return get_type() == TYPE_ERASURE; } + bool supports_omap() const { + return !(get_type() == TYPE_ERASURE || has_flag(FLAG_DEBUG_FAKE_EC_POOL)); + } + bool requires_aligned_append() const { return is_erasure(); } uint64_t required_alignment() const { return stripe_width; }