From: lishuhao Date: Sun, 14 Apr 2019 11:48:28 +0000 (+0800) Subject: osd: mark ObjectCleanRegions dirty for related operations X-Git-Tag: v15.1.0~2697^2~11 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=cb927925af1f3df4b9c31df85cf31f982aae1988;p=ceph.git osd: mark ObjectCleanRegions dirty for related operations Signed-off-by: Ning Yao Signed-off-by: lishuhao --- diff --git a/src/osd/PrimaryLogPG.cc b/src/osd/PrimaryLogPG.cc index 3d6dfb9e6e3f..62f7512e2424 100644 --- a/src/osd/PrimaryLogPG.cc +++ b/src/osd/PrimaryLogPG.cc @@ -6320,6 +6320,7 @@ int PrimaryLogPG::do_osd_ops(OpContext *ctx, vector& ops) trim.insert(op.extent.truncate_size, oi.size - op.extent.truncate_size); ctx->modified_ranges.union_of(trim); + ctx->clean_regions.mark_data_region_dirty(op.extent.truncate_size, oi.size - op.extent.truncate_size); } if (op.extent.truncate_size != oi.size) { truncate_update_size_and_usage(ctx->delta_stats, @@ -6367,7 +6368,8 @@ int PrimaryLogPG::do_osd_ops(OpContext *ctx, vector& ops) } write_update_size_and_usage(ctx->delta_stats, oi, ctx->modified_ranges, op.extent.offset, op.extent.length); - + ctx->clean_regions.mark_data_region_dirty(op.extent.offset, op.extent.length); + dout(10) << "clean_regions modified" << ctx->clean_regions << dendl; } break; @@ -6406,6 +6408,7 @@ int PrimaryLogPG::do_osd_ops(OpContext *ctx, vector& ops) write_update_size_and_usage(ctx->delta_stats, oi, ctx->modified_ranges, 0, op.extent.length, true); + ctx->clean_regions.mark_data_region_dirty(0, op.extent.length); } break; @@ -6441,6 +6444,7 @@ int PrimaryLogPG::do_osd_ops(OpContext *ctx, vector& ops) interval_set ch; ch.insert(op.extent.offset, op.extent.length); ctx->modified_ranges.union_of(ch); + ctx->clean_regions.mark_data_region_dirty(op.extent.offset, op.extent.length); ctx->delta_stats.num_wr++; oi.clear_data_digest(); } else { @@ -6520,7 +6524,10 @@ int PrimaryLogPG::do_osd_ops(OpContext *ctx, vector& ops) interval_set trim; trim.insert(op.extent.offset, oi.size-op.extent.offset); ctx->modified_ranges.union_of(trim); - } + ctx->clean_regions.mark_data_region_dirty(op.extent.offset, oi.size - op.extent.offset); + } else if (oi.size < op.extent.offset) { + ctx->clean_regions.mark_data_region_dirty(oi.size, op.extent.offset - oi.size); + } if (op.extent.offset != oi.size) { truncate_update_size_and_usage(ctx->delta_stats, oi, @@ -6762,11 +6769,15 @@ int PrimaryLogPG::do_osd_ops(OpContext *ctx, vector& ops) oi.manifest.redirect_target = target; oi.manifest.type = object_manifest_t::TYPE_REDIRECT; t->truncate(soid, 0); + ctx->clean_regions.mark_data_region_dirty(0, oi.size); if (oi.is_omap() && pool.info.supports_omap()) { t->omap_clear(soid); obs.oi.clear_omap_digest(); obs.oi.clear_flag(object_info_t::FLAG_OMAP); + ctx->clean_regions.mark_omap_dirty(); } + write_update_size_and_usage(ctx->delta_stats, oi, ctx->modified_ranges, + 0, oi.size, false); ctx->delta_stats.num_bytes -= oi.size; oi.size = 0; oi.new_object(); @@ -7421,6 +7432,7 @@ int PrimaryLogPG::do_osd_ops(OpContext *ctx, vector& ops) } } t->omap_setkeys(soid, to_set_bl); + ctx->clean_regions.mark_omap_dirty(); ctx->delta_stats.num_wr++; ctx->delta_stats.num_wr_kb += shift_round_up(to_set_bl.length(), 10); } @@ -7438,6 +7450,7 @@ int PrimaryLogPG::do_osd_ops(OpContext *ctx, vector& ops) { maybe_create_new_object(ctx); t->omap_setheader(soid, osd_op.indata); + ctx->clean_regions.mark_omap_dirty(); ctx->delta_stats.num_wr++; } obs.oi.set_flag(object_info_t::FLAG_OMAP); @@ -7458,6 +7471,7 @@ int PrimaryLogPG::do_osd_ops(OpContext *ctx, vector& ops) } if (oi.is_omap()) { t->omap_clear(soid); + ctx->clean_regions.mark_omap_dirty(); ctx->delta_stats.num_wr++; obs.oi.clear_omap_digest(); obs.oi.clear_flag(object_info_t::FLAG_OMAP); @@ -7489,6 +7503,7 @@ int PrimaryLogPG::do_osd_ops(OpContext *ctx, vector& ops) } tracepoint(osd, do_osd_op_pre_omaprmkeys, soid.oid.name.c_str(), soid.snap.val); t->omap_rmkeys(soid, to_rm_bl); + ctx->clean_regions.mark_omap_dirty(); ctx->delta_stats.num_wr++; } obs.oi.clear_omap_digest(); @@ -7693,8 +7708,10 @@ inline int PrimaryLogPG::_delete_oid( interval_set ch; ch.insert(0, oi.size); ctx->modified_ranges.union_of(ch); + ctx->clean_regions.mark_data_region_dirty(0, oi.size); } + ctx->clean_regions.mark_omap_dirty(); ctx->delta_stats.num_wr++; if (soid.is_snap()) { ceph_assert(ctx->obc->ssc->snapset.clone_overlap.count(soid.snap)); @@ -7870,6 +7887,8 @@ int PrimaryLogPG::_rollback_to(OpContext *ctx, ceph_osd_op& op) maybe_create_new_object(ctx, true); ctx->delta_stats.num_bytes -= obs.oi.size; ctx->delta_stats.num_bytes += rollback_to->obs.oi.size; + ctx->clean_regions.mark_data_region_dirty(0, std::max(obs.oi.size, rollback_to->obs.oi.size)); + ctx->clean_regions.mark_omap_dirty(); 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); @@ -8372,6 +8391,9 @@ void PrimaryLogPG::finish_ctx(OpContext *ctx, int log_op_type) ctx->obs->oi.version, ctx->user_at_version, ctx->reqid, ctx->mtime, 0)); + ctx->log.back().clean_regions = ctx->clean_regions; + dout(20) << __func__ << " object " << soid << " marks clean_regions " << ctx->log.back().clean_regions << dendl; + if (soid.snap < CEPH_NOSNAP) { switch (log_op_type) { case pg_log_entry_t::MODIFY: @@ -9211,6 +9233,7 @@ void PrimaryLogPG::process_copy_chunk_manifest(hobject_t oid, ceph_tid_t tid, in p.second->cursor.data_offset, sub_chunk.outdata.length()); obs.oi.manifest.chunk_map[p.second->cursor.data_offset].clear_flag(chunk_info_t::FLAG_DIRTY); obs.oi.manifest.chunk_map[p.second->cursor.data_offset].clear_flag(chunk_info_t::FLAG_MISSING); + ctx->clean_regions.mark_data_region_dirty(p.second->cursor.data_offset, sub_chunk.outdata.length()); sub_chunk.outdata.clear(); } obs.oi.clear_data_digest(); @@ -9393,6 +9416,7 @@ void PrimaryLogPG::finish_copyfrom(CopyFromCallback *cb) if (obs.oi.size > 0) ch.insert(0, obs.oi.size); ctx->modified_ranges.union_of(ch); + ctx->clean_regions.mark_data_region_dirty(0, std::max(obs.oi.size, cb->get_data_size())); if (cb->get_data_size() != obs.oi.size) { ctx->delta_stats.num_bytes -= obs.oi.size; @@ -9563,11 +9587,15 @@ void PrimaryLogPG::finish_promote(int r, CopyResults *results, } else { tctx->new_obs.oi.clear_data_digest(); } + if (results->object_size) + tctx->clean_regions.mark_data_region_dirty(0, results->object_size); if (results->is_omap_digest()) { tctx->new_obs.oi.set_omap_digest(results->omap_digest); } else { tctx->new_obs.oi.clear_omap_digest(); } + if (results->has_omap) + tctx->clean_regions.mark_omap_dirty(); tctx->new_obs.oi.truncate_seq = results->truncate_seq; tctx->new_obs.oi.truncate_size = results->truncate_size; @@ -10110,6 +10138,7 @@ int PrimaryLogPG::try_flush_mark_clean(FlushOpRef fop) t->omap_clear(oid); ctx->new_obs.oi.clear_omap_digest(); ctx->new_obs.oi.clear_flag(object_info_t::FLAG_OMAP); + ctx->clean_regions.mark_omap_dirty(); } if (obc->obs.oi.size == chunks_size) { t->truncate(oid, 0); @@ -10119,6 +10148,7 @@ int PrimaryLogPG::try_flush_mark_clean(FlushOpRef fop) truncate_update_size_and_usage(ctx->delta_stats, ctx->new_obs.oi, 0); + ctx->clean_regions.mark_data_region_dirty(0, ctx->new_obs.oi.size); ctx->new_obs.oi.new_object(); for (auto &p : ctx->new_obs.oi.manifest.chunk_map) { p.second.clear_flag(chunk_info_t::FLAG_DIRTY); @@ -13536,6 +13566,9 @@ void PrimaryLogPG::hit_set_persist() ctx->op_t->create(oid); if (bl.length()) { ctx->op_t->write(oid, 0, bl.length(), bl, 0); + write_update_size_and_usage(ctx->delta_stats, obc->obs.oi, ctx->modified_ranges, + 0, bl.length()); + ctx->clean_regions.mark_data_region_dirty(0, bl.length()); } map attrs; attrs[OI_ATTR].claim(boi); @@ -13552,6 +13585,7 @@ void PrimaryLogPG::hit_set_persist() ctx->mtime, 0) ); + ctx->log.back().clean_regions = ctx->clean_regions; hit_set_trim(ctx, max); diff --git a/src/osd/PrimaryLogPG.h b/src/osd/PrimaryLogPG.h index 5942be6c7650..b2fecb679b83 100644 --- a/src/osd/PrimaryLogPG.h +++ b/src/osd/PrimaryLogPG.h @@ -573,6 +573,7 @@ public: bool ignore_cache; ///< true if IGNORE_CACHE flag is set bool ignore_log_op_stats; // don't log op stats bool update_log_only; ///< this is a write that returned an error - just record in pg log for dup detection + ObjectCleanRegions clean_regions; // side effects list > watch_connects; ///< new watch + will_ping flag