From 211aadaee8cbcc7225f35ff37ede084f80264796 Mon Sep 17 00:00:00 2001 From: Samuel Just Date: Thu, 15 Aug 2013 15:35:26 -0700 Subject: [PATCH] ReplicatedPG: add osd_recover_clone_overlap_limit to limit clones We don't want to clone_range from clones too many times. For now, just skip the cloning if there are too many holes. Fixes: #5985 Signed-off-by: Samuel Just Reviewed-by: Sage Weil --- src/common/config_opts.h | 5 +++++ src/osd/ReplicatedPG.cc | 14 ++++++++++++++ 2 files changed, 19 insertions(+) diff --git a/src/common/config_opts.h b/src/common/config_opts.h index 843cc16a74714..f76dba15af2e6 100644 --- a/src/common/config_opts.h +++ b/src/common/config_opts.h @@ -403,6 +403,11 @@ OPTION(osd_op_pq_min_cost, OPT_U64, 65536) OPTION(osd_disk_threads, OPT_INT, 1) OPTION(osd_recovery_threads, OPT_INT, 1) OPTION(osd_recover_clone_overlap, OPT_BOOL, true) // preserve clone_overlap during recovery/migration + +// Only use clone_overlap for recovery if there are fewer than +// osd_recover_clone_overlap_limit entries in the overlap set +OPTION(osd_recover_clone_overlap_limit, OPT_INT, 10) + OPTION(osd_backfill_scan_min, OPT_INT, 64) OPTION(osd_backfill_scan_max, OPT_INT, 512) OPTION(osd_op_thread_timeout, OPT_INT, 15) diff --git a/src/osd/ReplicatedPG.cc b/src/osd/ReplicatedPG.cc index 628cf891dc8a7..8f9db04b1e95f 100644 --- a/src/osd/ReplicatedPG.cc +++ b/src/osd/ReplicatedPG.cc @@ -5182,6 +5182,13 @@ void ReplicatedPG::calc_head_subsets(ObjectContext *obc, SnapSet& snapset, const << " overlap " << prev << dendl; } + + if (cloning.num_intervals() > g_conf->osd_recover_clone_overlap_limit) { + dout(10) << "skipping clone, too many holes" << dendl; + clone_subsets.clear(); + cloning.clear(); + } + // what's left for us to push? data_subset.subtract(cloning); @@ -5251,6 +5258,13 @@ void ReplicatedPG::calc_clone_subsets(SnapSet& snapset, const hobject_t& soid, dout(10) << "calc_clone_subsets " << soid << " does not have next " << c << " overlap " << next << dendl; } + + if (cloning.num_intervals() > g_conf->osd_recover_clone_overlap_limit) { + dout(10) << "skipping clone, too many holes" << dendl; + clone_subsets.clear(); + cloning.clear(); + } + // what's left for us to push? data_subset.subtract(cloning); -- 2.39.5