]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
ReplicatedPG: add osd_recover_clone_overlap_limit to limit clones
authorSamuel Just <sam.just@inktank.com>
Thu, 15 Aug 2013 22:35:26 +0000 (15:35 -0700)
committerSamuel Just <sam.just@inktank.com>
Fri, 16 Aug 2013 23:40:23 +0000 (16:40 -0700)
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 <sam.just@inktank.com>
Reviewed-by: Sage Weil <sage@inktank.com>
src/common/config_opts.h
src/osd/ReplicatedPG.cc

index 843cc16a747144e77c8e6ba60fc17d3b63e3f086..f76dba15af2e6c72fbd0820f4539a7ce7c90efcf 100644 (file)
@@ -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)
index 628cf891dc8a7128863d3382b64b1d3a65c82aac..8f9db04b1e95f6189e757b2faf1877124ed67b45 100644 (file)
@@ -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);