From 89e43115a1600e4d35782617a5d4e6f6111b63a6 Mon Sep 17 00:00:00 2001 From: Igor Fedotov Date: Tue, 12 Dec 2017 22:50:17 +0300 Subject: [PATCH] osd: get rid off extent map in object_info Signed-off-by: Igor Fedotov --- src/osd/PrimaryLogPG.cc | 139 ++++++---------------------------------- src/osd/PrimaryLogPG.h | 6 +- src/osd/osd_types.cc | 30 ++------- src/osd/osd_types.h | 11 ---- src/osdc/Objecter.h | 9 +-- 5 files changed, 24 insertions(+), 171 deletions(-) diff --git a/src/osd/PrimaryLogPG.cc b/src/osd/PrimaryLogPG.cc index f06deacf222a6..a6388de3f1385 100644 --- a/src/osd/PrimaryLogPG.cc +++ b/src/osd/PrimaryLogPG.cc @@ -5447,21 +5447,6 @@ int PrimaryLogPG::do_osd_ops(OpContext *ctx, vector& ops) "osd_max_object_size"); PGTransaction* t = ctx->op_t.get(); - if (!oi.has_extents() && - get_osdmap()->require_osd_release >= CEPH_RELEASE_MIMIC) { - assert(oi.extents.empty()); - // note that this is ok because: - // 1. for reads, this should have no effect - // 2. for writes, we check if this is a pre-mimic created object - // (with FLAG_EXTENTS off). And if it is, we set FLAG_EXTENTS - // and initialize extents with a whole entry - [0, oi.size) only - // to make sure we have oi.extents.size() == oi.size at the very - // beginning, which is necessary for backward compatibility. - oi.set_flag(object_info_t::FLAG_EXTENTS); - if (oi.size) { - oi.extents.insert(0, oi.size); - } - } dout(10) << "do_osd_op " << soid << " " << ops << dendl; @@ -6323,15 +6308,6 @@ int PrimaryLogPG::do_osd_ops(OpContext *ctx, vector& ops) ctx->modified_ranges.union_of(ch); ctx->delta_stats.num_wr++; oi.clear_data_digest(); - if (oi.has_extents()) { - int64_t old_bytes = oi.extents.size(); - interval_set to_remove; - to_remove.subset_of(oi.extents, op.extent.offset, - op.extent.offset + op.extent.length); - oi.extents.subtract(to_remove); - int64_t new_bytes = oi.extents.size(); - ctx->delta_stats.num_bytes += new_bytes - old_bytes; - } } else { // no-op } @@ -6607,12 +6583,7 @@ int PrimaryLogPG::do_osd_ops(OpContext *ctx, vector& ops) obs.oi.clear_omap_digest(); obs.oi.clear_flag(object_info_t::FLAG_OMAP); } - if (oi.has_extents()) { - ctx->delta_stats.num_bytes -= oi.extents.size(); - oi.extents.clear(); - } else { - ctx->delta_stats.num_bytes -= oi.size; - } + ctx->delta_stats.num_bytes -= oi.size; oi.size = 0; oi.new_object(); oi.user_version = target_version; @@ -7392,12 +7363,7 @@ inline int PrimaryLogPG::_delete_oid( assert(ctx->obc->ssc->snapset.clone_overlap.count(soid.snap)); ctx->delta_stats.num_bytes -= ctx->obc->ssc->snapset.get_clone_bytes(soid.snap); } else { - if (oi.has_extents()) { - ctx->delta_stats.num_bytes -= oi.extents.size(); - oi.extents.clear(); - } else { - ctx->delta_stats.num_bytes -= oi.size; - } + ctx->delta_stats.num_bytes -= oi.size; } oi.size = 0; oi.new_object(); @@ -7560,23 +7526,8 @@ int PrimaryLogPG::_rollback_to(OpContext *ctx, ceph_osd_op& op) // Adjust the cached objectcontext maybe_create_new_object(ctx, true); - if (obs.oi.has_extents()) { - ctx->delta_stats.num_bytes -= obs.oi.extents.size(); - obs.oi.extents.clear(); - } else { - ctx->delta_stats.num_bytes -= obs.oi.size; - } - if (rollback_to->obs.oi.has_extents()) { - ctx->delta_stats.num_bytes += rollback_to->obs.oi.extents.size(); - // transfer extents map too - assert(obs.oi.has_extents()); - obs.oi.extents = rollback_to->obs.oi.extents; - } else { - ctx->delta_stats.num_bytes += rollback_to->obs.oi.size; - if (obs.oi.has_extents() && rollback_to->obs.oi.size) { - obs.oi.extents.insert(0, rollback_to->obs.oi.size); - } - } + ctx->delta_stats.num_bytes -= obs.oi.size; + ctx->delta_stats.num_bytes += rollback_to->obs.oi.size; obs.oi.size = rollback_to->obs.oi.size; if (rollback_to->obs.oi.is_data_digest()) obs.oi.set_data_digest(rollback_to->obs.oi.data_digest); @@ -7784,29 +7735,11 @@ void PrimaryLogPG::write_update_size_and_usage(object_stat_sum_t& delta_stats, o modified.union_of(ch); if (write_full || offset + length > oi.size) { uint64_t new_size = offset + length; - if (!oi.has_extents()) { - delta_stats.num_bytes -= oi.size; - delta_stats.num_bytes += new_size; - } + delta_stats.num_bytes -= oi.size; + delta_stats.num_bytes += new_size; oi.size = new_size; } - if (oi.has_extents()) { - delta_stats.num_bytes -= oi.extents.size(); - if (write_full) { - // oi.size may shrink - oi.extents.clear(); - assert(offset == 0); - if (length) { - oi.extents.insert(0, length); - } - } else { - if (length) { - oi.extents.union_of(ch); // deduplicated - } - } - delta_stats.num_bytes += oi.extents.size(); - } - + if (oi.has_manifest() && oi.manifest.is_chunked()) { for (auto &p : oi.manifest.chunk_map) { if ((p.first <= offset && p.first + p.second.length > offset) || @@ -7824,29 +7757,11 @@ void PrimaryLogPG::truncate_update_size_and_usage( object_info_t& oi, uint64_t truncate_size) { - if (oi.size == truncate_size) { - // no change - return; - } - if (oi.has_extents()) { - int64_t old_bytes = oi.extents.size(); - if (truncate_size > oi.size) { - // trunc up - oi.extents.insert(oi.size, truncate_size - oi.size); - } else { - // trunc down - interval_set new_extents; - new_extents.subset_of(oi.extents, 0, truncate_size); - oi.extents.swap(new_extents); - } - int64_t new_bytes = oi.extents.size(); - delta_stats.num_bytes += new_bytes - old_bytes; - } else { - // fall back to old fashion + if (oi.size != truncate_size) { delta_stats.num_bytes -= oi.size; delta_stats.num_bytes += truncate_size; + oi.size = truncate_size; } - oi.size = truncate_size; } void PrimaryLogPG::complete_disconnect_watches( @@ -8424,12 +8339,6 @@ int PrimaryLogPG::do_copy_get(OpContext *ctx, bufferlist::iterator& bp, // but it works... pg_log.get_log().get_object_reqids(ctx->obc->obs.oi.soid, 10, &reply_obj.reqids); dout(20) << " got reqids" << dendl; - if (oi.has_extents()) { - // note that we might call this multiple times - // include extents only in the final step to make extents.insert happy - reply_obj.flags |= object_copy_data_t::FLAG_EXTENTS; - reply_obj.extents = oi.extents; - } } dout(20) << " cursor.is_complete=" << cursor.is_complete() @@ -8561,7 +8470,6 @@ void PrimaryLogPG::_copy_some(ObjectContextRef obc, CopyOpRef cop) &cop->results.reqids, &cop->results.truncate_seq, &cop->results.truncate_size, - &cop->results.extents, &cop->rval); op.set_last_op_flags(cop->src_obj_fadvise_flags); @@ -9107,12 +9015,11 @@ void PrimaryLogPG::finish_copyfrom(CopyFromCallback *cb) ch.insert(0, obs.oi.size); ctx->modified_ranges.union_of(ch); - ctx->delta_stats.num_bytes -= obs.oi.has_extents() ? - obs.oi.extents.size() : obs.oi.size; - obs.oi.clear_flag(object_info_t::FLAG_EXTENTS); - obs.oi.extents.clear(); - obs.oi.size = cb->get_data_size(); - ctx->delta_stats.num_bytes += obs.oi.size; + if (cb->get_data_size() != obs.oi.size) { + ctx->delta_stats.num_bytes -= obs.oi.size; + obs.oi.size = cb->get_data_size(); + ctx->delta_stats.num_bytes += obs.oi.size; + } ctx->delta_stats.num_wr++; ctx->delta_stats.num_wr_kb += SHIFT_ROUND_UP(obs.oi.size, 10); @@ -9281,10 +9188,6 @@ void PrimaryLogPG::finish_promote(int r, CopyResults *results, } tctx->new_obs.oi.truncate_seq = results->truncate_seq; tctx->new_obs.oi.truncate_size = results->truncate_size; - if (results->has_extents()) { - tctx->new_obs.oi.set_flag(object_info_t::FLAG_EXTENTS); - tctx->new_obs.oi.extents = results->extents; - } if (soid.snap != CEPH_NOSNAP) { assert(obc->ssc->snapset.clone_snaps.count(soid.snap)); @@ -9295,8 +9198,7 @@ void PrimaryLogPG::finish_promote(int r, CopyResults *results, tctx->delta_stats.num_bytes += obc->ssc->snapset.get_clone_bytes(soid.snap); } else { - tctx->delta_stats.num_bytes += results->has_extents() ? - results->extents.size() : results->object_size; + tctx->delta_stats.num_bytes += results->object_size; } } @@ -10886,8 +10788,7 @@ void PrimaryLogPG::add_object_context_to_pg_stat(ObjectContextRef obc, pg_stat_t assert(obc->ssc); stat.num_bytes += obc->ssc->snapset.get_clone_bytes(oi.soid.snap); } else { - stat.num_bytes += oi.has_extents() ? - oi.extents.size() : oi.size; + stat.num_bytes += oi.size; } // add it in @@ -13386,9 +13287,7 @@ void PrimaryLogPG::hit_set_persist() ctx->delta_stats.num_objects++; ctx->delta_stats.num_objects_hit_set_archive++; - // we do not use extents for usage tracking - // of hit_set_archive objects, for now! - assert(!obc->obs.oi.has_extents()); + ctx->delta_stats.num_bytes += bl.length(); ctx->delta_stats.num_bytes_hit_set_archive += bl.length(); @@ -13454,7 +13353,6 @@ void PrimaryLogPG::hit_set_trim(OpContextUPtr &ctx, unsigned max) assert(obc); --ctx->delta_stats.num_objects; --ctx->delta_stats.num_objects_hit_set_archive; - assert(!obc->obs.oi.has_extents()); ctx->delta_stats.num_bytes -= obc->obs.oi.size; ctx->delta_stats.num_bytes_hit_set_archive -= obc->obs.oi.size; } @@ -14414,8 +14312,7 @@ void PrimaryLogPG::scrub_snapshot_metadata( // A clone num_bytes will be added later when we have snapset if (!soid.is_snap()) { - stat.num_bytes += oi->has_extents() ? - oi->extents.size() : oi->size; + stat.num_bytes += oi->size; } if (soid.nspace == cct->_conf->osd_hit_set_namespace) stat.num_bytes_hit_set_archive += oi->size; diff --git a/src/osd/PrimaryLogPG.h b/src/osd/PrimaryLogPG.h index fe30ef392433c..9e97c42e86c87 100644 --- a/src/osd/PrimaryLogPG.h +++ b/src/osd/PrimaryLogPG.h @@ -95,16 +95,12 @@ public: map attrs; // xattrs uint64_t truncate_seq; uint64_t truncate_size; - interval_set extents; // object logical extents map bool is_data_digest() { return flags & object_copy_data_t::FLAG_DATA_DIGEST; } bool is_omap_digest() { return flags & object_copy_data_t::FLAG_OMAP_DIGEST; } - bool has_extents() { - return flags & object_copy_data_t::FLAG_EXTENTS; - } CopyResults() : object_size(0), started_temp_obj(false), user_version(0), @@ -1141,7 +1137,7 @@ protected: void write_update_size_and_usage(object_stat_sum_t& stats, object_info_t& oi, interval_set& modified, uint64_t offset, uint64_t length, bool write_full=false); - void truncate_update_size_and_usage( + inline void truncate_update_size_and_usage( object_stat_sum_t& delta_stats, object_info_t& oi, uint64_t truncate_size); diff --git a/src/osd/osd_types.cc b/src/osd/osd_types.cc index e8599f92197a8..aaa8c91ecdf30 100644 --- a/src/osd/osd_types.cc +++ b/src/osd/osd_types.cc @@ -4298,7 +4298,7 @@ void object_copy_cursor_t::generate_test_instances(list& void object_copy_data_t::encode(bufferlist& bl, uint64_t features) const { - ENCODE_START(8, 5, bl); + ENCODE_START(7, 5, bl); ::encode(size, bl); ::encode(mtime, bl); ::encode(attrs, bl); @@ -4314,13 +4314,12 @@ void object_copy_data_t::encode(bufferlist& bl, uint64_t features) const ::encode(reqids, bl); ::encode(truncate_seq, bl); ::encode(truncate_size, bl); - ::encode(extents, bl); ENCODE_FINISH(bl); } void object_copy_data_t::decode(bufferlist::iterator& bl) { - DECODE_START(8, bl); + DECODE_START(7, bl); if (struct_v < 5) { // old ::decode(size, bl); @@ -4376,9 +4375,6 @@ void object_copy_data_t::decode(bufferlist::iterator& bl) ::decode(truncate_seq, bl); ::decode(truncate_size, bl); } - if (struct_v >= 8) { - ::decode(extents, bl); - } } DECODE_FINISH(bl); } @@ -4413,7 +4409,6 @@ void object_copy_data_t::generate_test_instances(list& o) o.back()->omap_header.append("this is an omap header"); o.back()->snaps.push_back(123); o.back()->reqids.push_back(make_pair(osd_reqid_t(), version_t())); - o.back()->extents.insert(0, 123); } void object_copy_data_t::dump(Formatter *f) const @@ -5003,7 +4998,6 @@ void object_info_t::copy_user_bits(const object_info_t& other) user_version = other.user_version; data_digest = other.data_digest; omap_digest = other.omap_digest; - extents = other.extents; } void object_info_t::encode(bufferlist& bl, uint64_t features) const @@ -5016,7 +5010,7 @@ void object_info_t::encode(bufferlist& bl, uint64_t features) const ++i) { old_watchers.insert(make_pair(i->first.second, i->second)); } - ENCODE_START(18, 8, bl); + ENCODE_START(17, 8, bl); ::encode(soid, bl); ::encode(myoloc, bl); //Retained for compatibility ::encode((__u32)0, bl); // was category, no longer used @@ -5050,14 +5044,13 @@ void object_info_t::encode(bufferlist& bl, uint64_t features) const if (has_manifest()) { ::encode(manifest, bl); } - ::encode(extents, bl); ENCODE_FINISH(bl); } void object_info_t::decode(bufferlist::iterator& bl) { object_locator_t myoloc; - DECODE_START_LEGACY_COMPAT_LEN(18, 8, 8, bl); + DECODE_START_LEGACY_COMPAT_LEN(17, 8, 8, bl); map old_watchers; ::decode(soid, bl); ::decode(myoloc, bl); @@ -5145,9 +5138,6 @@ void object_info_t::decode(bufferlist::iterator& bl) ::decode(manifest, bl); } } - if (struct_v >= 18) { - ::decode(extents, bl); - } DECODE_FINISH(bl); } @@ -5173,15 +5163,6 @@ void object_info_t::dump(Formatter *f) const f->dump_unsigned("expected_write_size", expected_write_size); f->dump_unsigned("alloc_hint_flags", alloc_hint_flags); f->dump_object("manifest", manifest); - f->open_array_section("extents"); - for (interval_set::const_iterator p = extents.begin(); - p != extents.end(); ++p) { - f->open_object_section("extent"); - f->dump_unsigned("offset", p.get_start()); - f->dump_unsigned("length", p.get_len()); - f->close_section(); - } - f->close_section(); f->open_object_section("watchers"); for (map,watch_info_t>::const_iterator p = watchers.begin(); p != watchers.end(); ++p) { @@ -5219,9 +5200,6 @@ ostream& operator<<(ostream& out, const object_info_t& oi) << " " << oi.alloc_hint_flags << "]"; if (oi.has_manifest()) out << " " << oi.manifest; - if (oi.has_extents()) { - out << " extents " << oi.extents; - } out << ")"; return out; } diff --git a/src/osd/osd_types.h b/src/osd/osd_types.h index 33a804a3e350f..2ea499e59ae62 100644 --- a/src/osd/osd_types.h +++ b/src/osd/osd_types.h @@ -4286,7 +4286,6 @@ struct object_copy_data_t { enum { FLAG_DATA_DIGEST = 1<<0, FLAG_OMAP_DIGEST = 1<<1, - FLAG_EXTENTS = 1<<2, }; object_copy_cursor_t cursor; uint64_t size; @@ -4309,9 +4308,6 @@ struct object_copy_data_t { uint64_t truncate_seq; uint64_t truncate_size; - ///< object logical extents map - interval_set extents; - public: object_copy_data_t() : size((uint64_t)-1), data_digest(-1), @@ -4637,7 +4633,6 @@ struct object_info_t { FLAG_CACHE_PIN = 1<<6, // pin the object in cache tier FLAG_MANIFEST = 1<<7, // has manifest FLAG_USES_TMAP = 1<<8, // deprecated; no longer used - FLAG_EXTENTS = 1<<9, // logical extents map is valid } flag_t; flag_t flags; @@ -4662,8 +4657,6 @@ struct object_info_t { s += "|cache_pin"; if (flags & FLAG_MANIFEST) s += "|manifest"; - if (flags & FLAG_EXTENTS) - s += "|extents"; if (s.length()) return s.substr(1); return s; @@ -4685,7 +4678,6 @@ struct object_info_t { uint32_t alloc_hint_flags; struct object_manifest_t manifest; - interval_set extents; // deduplicated logical extents map void copy_user_bits(const object_info_t& other); @@ -4722,9 +4714,6 @@ struct object_info_t { bool has_manifest() const { return test_flag(FLAG_MANIFEST); } - bool has_extents() const { - return test_flag(FLAG_EXTENTS); - } void set_data_digest(__u32 d) { set_flag(FLAG_DATA_DIGEST); data_digest = d; diff --git a/src/osdc/Objecter.h b/src/osdc/Objecter.h index ef620ee94b830..cb9af1dbebb7d 100644 --- a/src/osdc/Objecter.h +++ b/src/osdc/Objecter.h @@ -738,7 +738,6 @@ struct ObjectOperation { mempool::osd_pglog::vector > *out_reqids; uint64_t *out_truncate_seq; uint64_t *out_truncate_size; - interval_set *out_extents; int *prval; C_ObjectOperation_copyget(object_copy_cursor_t *c, uint64_t *s, @@ -754,7 +753,6 @@ struct ObjectOperation { mempool::osd_pglog::vector > *oreqids, uint64_t *otseq, uint64_t *otsize, - interval_set *otextents, int *r) : cursor(c), out_size(s), out_mtime(m), @@ -764,7 +762,6 @@ struct ObjectOperation { out_reqids(oreqids), out_truncate_seq(otseq), out_truncate_size(otsize), - out_extents(otextents), prval(r) {} void finish(int r) override { // reqids are copied on ENOENT @@ -807,9 +804,6 @@ struct ObjectOperation { *out_truncate_seq = copy_reply.truncate_seq; if (out_truncate_size) *out_truncate_size = copy_reply.truncate_size; - if (out_extents) { - *out_extents = copy_reply.extents; - } *cursor = copy_reply.cursor; } catch (buffer::error& e) { if (prval) @@ -834,7 +828,6 @@ struct ObjectOperation { mempool::osd_pglog::vector > *out_reqids, uint64_t *truncate_seq, uint64_t *truncate_size, - interval_set *extents, int *prval) { OSDOp& osd_op = add_op(CEPH_OSD_OP_COPY_GET); osd_op.op.copy_get.max = max; @@ -848,7 +841,7 @@ struct ObjectOperation { out_omap_data, out_snaps, out_snap_seq, out_flags, out_data_digest, out_omap_digest, out_reqids, truncate_seq, - truncate_size, extents, prval); + truncate_size, prval); out_bl[p] = &h->bl; out_handler[p] = h; } -- 2.39.5