summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSamuel Just <sam.just@inktank.com>2013-08-15 15:35:26 -0700
committerSamuel Just <sam.just@inktank.com>2013-08-15 15:35:26 -0700
commit56221d86cead9896892deecfc86d125d1ee0e4bb (patch)
tree61c9e82d6d78276fa754eadda439245e28e5ebd5
parente7836e6e7ddb5f78db4bab2ab94a566b317bdbfb (diff)
downloadceph-wip-5985.tar.gz
ReplicatedPG: add osd_recover_clone_overlap_limit to limit cloneswip-5985
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 <sam.just@inktank.com>
-rw-r--r--src/common/config_opts.h5
-rw-r--r--src/osd/ReplicatedPG.cc14
2 files changed, 19 insertions, 0 deletions
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);