]> git.apps.os.sepia.ceph.com Git - ceph-ci.git/commitdiff
osd: make max_num_intervals of ObjectCleanRegions a configuration option
authorletterwuyu <lishuhao@unitedstack.com>
Tue, 7 May 2019 10:27:54 +0000 (18:27 +0800)
committerletterwuyu <lishuhao@unitedstack.com>
Thu, 9 May 2019 14:31:32 +0000 (22:31 +0800)
Signed-off-by: lishuhao <lishuhao@unitedstack.com>
src/common/legacy_config_opts.h
src/common/options.cc
src/osd/OSD.cc
src/osd/osd_types.cc
src/osd/osd_types.h
src/test/osd/types.cc

index d6bb8b2f36d27ce5aeab7c67df8921b1fb5ae560..67607ae206d7da1d92f1971886052650433abb01 100644 (file)
@@ -735,6 +735,7 @@ OPTION(osd_pg_epoch_persisted_max_stale, OPT_U32) // make this < map_cache_size!
 OPTION(osd_min_pg_log_entries, OPT_U32)  // number of entries to keep in the pg log when trimming it
 OPTION(osd_max_pg_log_entries, OPT_U32) // max entries, say when degraded, before we trim
 OPTION(osd_pg_log_dups_tracked, OPT_U32) // how many versions back to track combined in both pglog's regular + dup logs
+OPTION(osd_object_clean_region_max_num_intervals, OPT_INT) // number of intervals in clean_offsets
 OPTION(osd_force_recovery_pg_log_entries_factor, OPT_FLOAT) // max entries factor before force recovery
 OPTION(osd_pg_log_trim_min, OPT_U32)
 OPTION(osd_pg_log_trim_max, OPT_U32)
index 7e7c7ae9a0030cb071e756ff69a45f0623a0b451..64512e4008c5afb952af38f9fbb32a547c09068a 100644 (file)
@@ -3549,6 +3549,14 @@ std::vector<Option> get_global_options() {
     .add_see_also("osd_min_pg_log_entries")
     .add_see_also("osd_max_pg_log_entries"),
 
+    Option("osd_object_clean_region_max_num_intervals", Option::TYPE_INT, Option::LEVEL_ADVANCED)
+    .set_default(10)
+    .set_description("number of intervals in clean_offsets")
+    .set_long_description("partial recovery uses multiple intervals to record the clean part of the object"
+        "when the number of intervals is greater than osd_object_clean_region_max_num_intervals, minimum interval will be trimmed"
+        "(0 will recovery the entire object data interval)")
+    .add_service("osd"),
+
     Option("osd_force_recovery_pg_log_entries_factor", Option::TYPE_FLOAT, Option::LEVEL_ADVANCED)
     .set_default(1.3)
     .set_description(""),
index d1a8e7b754e38ddf1ffd573a860deee5d7c37a2a..bca88fc37ba432f8f22802ddb98c2971a57d2347 100644 (file)
@@ -2297,6 +2297,7 @@ OSD::OSD(CephContext *cct_, ObjectStore *store_,
                                            cct->_conf->osd_op_history_duration);
   op_tracker.set_history_slow_op_size_and_threshold(cct->_conf->osd_op_history_slow_op_size,
                                                     cct->_conf->osd_op_history_slow_op_threshold);
+  ObjectCleanRegions::set_max_num_intervals(cct->_conf->osd_object_clean_region_max_num_intervals);
 #ifdef WITH_BLKIN
   std::stringstream ss;
   ss << "osd." << whoami;
@@ -9854,6 +9855,7 @@ const char** OSD::get_tracked_conf_keys() const
     "osd_client_message_cap",
     "osd_heartbeat_min_size",
     "osd_heartbeat_interval",
+    "osd_object_clean_region_max_num_intervals",
     NULL
   };
   return KEYS;
@@ -9940,6 +9942,9 @@ void OSD::handle_conf_change(const ConfigProxy& conf,
       pol.throttler_bytes->reset_max(newval);
     }
   }
+  if (changed.count("osd_object_clean_region_max_num_intervals")) {
+    ObjectCleanRegions::set_max_num_intervals(cct->_conf->osd_object_clean_region_max_num_intervals);
+  }
 
   check_config();
 }
@@ -9975,6 +9980,11 @@ void OSD::check_config()
                 << " is not > osd_pg_epoch_persisted_max_stale ("
                 << cct->_conf->osd_pg_epoch_persisted_max_stale << ")";
   }
+  if (cct->_conf->osd_object_clean_region_max_num_intervals < 0) {
+    clog->warn() << "osd_object_clean_region_max_num_intervals (" 
+                 << cct->_conf->osd_object_clean_region_max_num_intervals
+                << ") is < 0";
+  }
 }
 
 // --------------------------------
index ce7e129041f5fcc51780ee9da10bafbfe1bd010e..80f032556f7bb9ef1bf9124a123885297055c3f3 100644 (file)
@@ -35,7 +35,6 @@ extern "C" {
 }
 
 #include "common/Formatter.h"
-
 #include "OSDMap.h"
 #include "osd_types.h"
 
@@ -4275,6 +4274,13 @@ void ObjectModDesc::decode(ceph::buffer::list::const_iterator &_bl)
   DECODE_FINISH(_bl);
 }
 
+std::atomic<int32_t> ObjectCleanRegions::max_num_intervals = {10};
+
+void ObjectCleanRegions::set_max_num_intervals(int32_t num)
+{
+  max_num_intervals = num;
+}
+
 void ObjectCleanRegions::trim()
 {
   while(clean_offsets.num_intervals() > max_num_intervals) {
index 2fbb375eb0e22307752b00469eba3f7c1d286cf1..5090e86826f9c35cdce5b15f902ebcb4a41ece0d 100644 (file)
 /// priority when more full
 #define OSD_DELETE_PRIORITY_FULL 255
 
-/// max intervals for clean_offsets in ObjectCleanRegions
-#define OSD_CLEAN_OFFSETS_MAX_INTERVALS 10
 static std::map<int, int> max_prio_map = {
        {OSD_BACKFILL_PRIORITY_BASE, OSD_BACKFILL_DEGRADED_PRIORITY_BASE - 1},
        {OSD_BACKFILL_DEGRADED_PRIORITY_BASE, OSD_RECOVERY_PRIORITY_BASE - 1},
@@ -3748,10 +3746,10 @@ WRITE_CLASS_ENCODER(ObjectModDesc)
 
 class ObjectCleanRegions {
 private:
-  interval_set<uint64_t> clean_offsets;
-  bool clean_omap;
   bool new_object;
-  int32_t max_num_intervals;
+  bool clean_omap;
+  interval_set<uint64_t> clean_offsets;
+  static std::atomic<int32_t> max_num_intervals;
 
   /**
    * trim the number of intervals if clean_offsets.num_intervals()
@@ -3763,18 +3761,17 @@ private:
   void trim();
   friend ostream& operator<<(ostream& out, const ObjectCleanRegions& ocr);
 public:
-  ObjectCleanRegions(int32_t max = OSD_CLEAN_OFFSETS_MAX_INTERVALS) : new_object(false), max_num_intervals(max) {
+  ObjectCleanRegions() : new_object(false), clean_omap(true) {
     clean_offsets.insert(0, (uint64_t)-1);
-    clean_omap = true;
   }
-  ObjectCleanRegions(uint64_t offset, uint64_t len, bool co, int32_t max = OSD_CLEAN_OFFSETS_MAX_INTERVALS)
-    : clean_omap(co), new_object(false), max_num_intervals(max) {
+  ObjectCleanRegions(uint64_t offset, uint64_t len, bool co)
+    : new_object(false), clean_omap(co) {
     clean_offsets.insert(offset, len);
   }
   bool operator==(const ObjectCleanRegions &orc) const {
-    return clean_offsets == orc.clean_offsets && clean_omap == orc.clean_omap && max_num_intervals == orc.max_num_intervals && new_object == orc.new_object;
+    return new_object == orc.new_object && clean_omap == orc.clean_omap && clean_offsets == orc.clean_offsets;
   }
-
+  static void set_max_num_intervals(int32_t num);
   void merge(const ObjectCleanRegions &other);
   void mark_data_region_dirty(uint64_t offset, uint64_t len);
   void mark_omap_dirty();
@@ -3787,7 +3784,7 @@ public:
   void encode(bufferlist &bl) const;
   void decode(bufferlist::const_iterator &bl);
   void dump(Formatter *f) const;
-    static void generate_test_instances(list<ObjectCleanRegions*>& o);
+  static void generate_test_instances(list<ObjectCleanRegions*>& o);
 };
 WRITE_CLASS_ENCODER(ObjectCleanRegions)
 ostream& operator<<(ostream& out, const ObjectCleanRegions& ocr);
index 0c9aae135f2b4598b8c8b94fd37d1eafac5a4b93..d9a821ef99c7927331df0be66cdb137974323d02 100644 (file)
@@ -23,7 +23,6 @@
 #include "common/Thread.h"
 #include "include/stringify.h"
 #include "osd/ReplicatedBackend.h"
-
 #include <sstream>
 
 TEST(hobject, prefixes0)
@@ -931,7 +930,7 @@ TEST(ObjectCleanRegions, mark_omap_dirty)
 
 TEST(ObjectCleanRegions, merge)
 {
-  ObjectCleanRegions cr1(2), cr2(4);
+  ObjectCleanRegions cr1, cr2;
   interval_set<uint64_t> cr1_expect;
   interval_set<uint64_t> cr2_expect;
   ASSERT_EQ(cr1_expect, cr1.get_dirty_regions());