From: Neha Ojha Date: Tue, 18 Dec 2018 00:20:10 +0000 (-0800) Subject: osd/mon: fix upgrades for pg log hard limit X-Git-Tag: v13.2.5~52^2~7 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=8a767df03a8fae8b6c1c409fa235a9229650f5cc;p=ceph.git osd/mon: fix upgrades for pg log hard limit Signed-off-by: Neha Ojha (cherry picked from commit 6ceeab6e204286148a69eb147fbc4045beddef49) Conflicts: src/mon/MonCommands.h: trivial resolution --- diff --git a/src/include/rados.h b/src/include/rados.h index 3c555a7032f..74dd86b29ac 100644 --- a/src/include/rados.h +++ b/src/include/rados.h @@ -159,6 +159,7 @@ extern const char *ceph_osd_state_name(int s); #define CEPH_OSDMAP_RECOVERY_DELETES (1<<19) /* deletes performed during recovery instead of peering */ #define CEPH_OSDMAP_PURGED_SNAPDIRS (1<<20) /* osds have converted snapsets */ #define CEPH_OSDMAP_NOSNAPTRIM (1<<21) /* disable snap trimming */ +#define CEPH_OSDMAP_PGLOG_HARDLIMIT (1<<22) /* put a hard limit on pg log length */ /* these are hidden in 'ceph status' view */ #define CEPH_OSDMAP_SEMIHIDDEN_FLAGS (CEPH_OSDMAP_REQUIRE_JEWEL| \ diff --git a/src/mon/MonCommands.h b/src/mon/MonCommands.h index 11f430f156e..d3a9b997e2a 100644 --- a/src/mon/MonCommands.h +++ b/src/mon/MonCommands.h @@ -739,7 +739,7 @@ COMMAND("osd erasure-code-profile ls", \ "list all erasure code profiles", \ "osd", "r", "cli,rest") COMMAND("osd set " \ - "name=key,type=CephChoices,strings=full|pause|noup|nodown|noout|noin|nobackfill|norebalance|norecover|noscrub|nodeep-scrub|notieragent|nosnaptrim|sortbitwise|recovery_deletes|require_jewel_osds|require_kraken_osds " \ + "name=key,type=CephChoices,strings=full|pause|noup|nodown|noout|noin|nobackfill|norebalance|norecover|noscrub|nodeep-scrub|notieragent|nosnaptrim|sortbitwise|recovery_deletes|require_jewel_osds|require_kraken_osds|pglog_hardlimit " \ "name=sure,type=CephChoices,strings=--yes-i-really-mean-it,req=false", \ "set ", "osd", "rw", "cli,rest") COMMAND("osd unset " \ diff --git a/src/mon/OSDMonitor.cc b/src/mon/OSDMonitor.cc index 16a3f7bd638..d218b28e460 100644 --- a/src/mon/OSDMonitor.cc +++ b/src/mon/OSDMonitor.cc @@ -2734,6 +2734,14 @@ bool OSDMonitor::preprocess_boot(MonOpRequestRef op) goto ignore; } + if (osdmap.test_flag(CEPH_OSDMAP_PGLOG_HARDLIMIT) && + !(m->osd_features & CEPH_FEATURE_OSD_PGLOG_HARDLIMIT)) { + mon->clog->info() << "disallowing boot of OSD " + << m->get_orig_source_inst() + << " because 'pglog_hardlimit' osdmap flag is set and OSD lacks the OSD_PGLOG_HARDLIMIT feature"; + goto ignore; + } + // already booted? if (osdmap.is_up(from) && osdmap.get_inst(from) == m->get_orig_source_inst() && @@ -9570,6 +9578,24 @@ bool OSDMonitor::prepare_command_impl(MonOpRequestRef op, err = -EPERM; goto reply; } + } else if (key == "pglog_hardlimit") { + if (!osdmap.get_num_up_osds() && sure != "--yes-i-really-mean-it") { + ss << "Not advisable to continue since no OSDs are up. Pass " + << "--yes-i-really-mean-it if you really wish to continue."; + err = -EPERM; + goto reply; + } + // The release check here is required because for OSD_PGLOG_HARDLIMIT, + // we are reusing a jewel feature bit that was retired in luminous. + if (osdmap.require_osd_release >= CEPH_RELEASE_LUMINOUS && + (HAVE_FEATURE(osdmap.get_up_osd_features(), OSD_PGLOG_HARDLIMIT) + || sure == "--yes-i-really-mean-it")) { + return prepare_set_flag(op, CEPH_OSDMAP_PGLOG_HARDLIMIT); + } else { + ss << "not all up OSDs have OSD_PGLOG_HARDLIMIT feature"; + err = -EPERM; + goto reply; + } } else if (key == "require_jewel_osds") { if (!osdmap.get_num_up_osds() && sure != "--yes-i-really-mean-it") { ss << "Not advisable to continue since no OSDs are up. Pass " diff --git a/src/osd/OSDMap.cc b/src/osd/OSDMap.cc index 65c7ea6295e..3018b53510f 100644 --- a/src/osd/OSDMap.cc +++ b/src/osd/OSDMap.cc @@ -2015,6 +2015,12 @@ int OSDMap::apply_incremental(const Incremental &inc) } } + if (inc.new_require_osd_release >= 0) { + require_osd_release = inc.new_require_osd_release; + if (require_osd_release >= CEPH_RELEASE_NAUTILUS) { + flags |= CEPH_OSDMAP_PGLOG_HARDLIMIT; + } + } // do new crush map last (after up/down stuff) if (inc.crush.length()) { bufferlist bl(inc.crush); @@ -2959,6 +2965,9 @@ void OSDMap::decode(bufferlist::iterator& bl) if (struct_v >= 5) { decode(require_min_compat_client, bl); decode(require_osd_release, bl); + if (require_osd_release >= CEPH_RELEASE_NAUTILUS) { + flags |= CEPH_OSDMAP_PGLOG_HARDLIMIT; + } if (require_osd_release >= CEPH_RELEASE_LUMINOUS) { flags &= ~(CEPH_OSDMAP_LEGACY_REQUIRE_FLAGS); flags |= CEPH_OSDMAP_RECOVERY_DELETES; @@ -3277,6 +3286,8 @@ string OSDMap::get_flag_string(unsigned f) s += ",recovery_deletes"; if (f & CEPH_OSDMAP_PURGED_SNAPDIRS) s += ",purged_snapdirs"; + if (f & CEPH_OSDMAP_PGLOG_HARDLIMIT) + s += ",pglog_hardlimit"; if (s.length()) s.erase(0, 1); return s; diff --git a/src/osd/PG.h b/src/osd/PG.h index 36a8e5a1825..91a2c9241e9 100644 --- a/src/osd/PG.h +++ b/src/osd/PG.h @@ -2760,6 +2760,10 @@ protected: return !(get_osdmap()->test_flag(CEPH_OSDMAP_RECOVERY_DELETES)); } + bool hard_limit_pglog() const { + return (get_osdmap()->test_flag(CEPH_OSDMAP_PGLOG_HARDLIMIT)); + } + void init_primary_up_acting( const vector &newup, const vector &newacting, diff --git a/src/osd/PrimaryLogPG.cc b/src/osd/PrimaryLogPG.cc index 55301dd5d8a..44b9aca1e8d 100644 --- a/src/osd/PrimaryLogPG.cc +++ b/src/osd/PrimaryLogPG.cc @@ -3975,7 +3975,10 @@ void PrimaryLogPG::execute_ctx(OpContext *ctx) assert(op->may_write() || op->may_cache()); // trim log? - calc_trim_to(); + if (hard_limit_pglog()) + calc_trim_to_aggressive(); + else + calc_trim_to(); // verify that we are doing this in order? if (cct->_conf->osd_debug_op_order && m->get_source().is_client() && @@ -10500,7 +10503,10 @@ void PrimaryLogPG::simple_opc_submit(OpContextUPtr ctx) dout(20) << __func__ << " " << repop << dendl; issue_repop(repop, ctx.get()); eval_repop(repop); - calc_trim_to(); + if (hard_limit_pglog()) + calc_trim_to_aggressive(); + else + calc_trim_to(); repop->put(); } @@ -10614,7 +10620,10 @@ void PrimaryLogPG::submit_log_entries( op_applied(info.last_update); }); - calc_trim_to(); + if (hard_limit_pglog()) + calc_trim_to_aggressive(); + else + calc_trim_to(); } void PrimaryLogPG::cancel_log_updates()