From 56221d86cead9896892deecfc86d125d1ee0e4bb Mon Sep 17 00:00:00 2001 From: Samuel Just Date: Thu, 15 Aug 2013 15:35:26 -0700 Subject: 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. Signed-off-by: Samuel Just --- 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 52458c268c8..52fc416766b 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 ab9c8099a44..eb300792e3a 100644 --- a/src/osd/ReplicatedPG.cc +++ b/src/osd/ReplicatedPG.cc @@ -5128,6 +5128,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); @@ -5197,6 +5204,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); -- cgit v1.2.1