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: v12.2.11~13^2~7 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=67dd60cedbecdff0f8c42e764a53b6b16405d9c0;p=ceph.git osd/mon: fix upgrades for pg log hard limit Signed-off-by: Neha Ojha (cherry picked from commit 6ceeab6e204286148a69eb147fbc4045beddef49) Conflicts: src/include/rados.h src/mon/MonCommands.h src/mon/OSDMonitor.cc src/osd/OSDMap.cc Luminous does not have CEPH_OSDMAP_NOSNAPTRIM flag. In nautilus, CEPH_OSDMAP_PGLOG_HARDLIMIT is set by default, which is not the case in luminous. --- diff --git a/src/include/rados.h b/src/include/rados.h index e91236a011c..040a534d9a4 100644 --- a/src/include/rados.h +++ b/src/include/rados.h @@ -157,6 +157,7 @@ extern const char *ceph_osd_state_name(int s); #define CEPH_OSDMAP_REQUIRE_LUMINOUS (1<<18) /* require l for booting osds */ #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_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 c147e3679d0..6890af25a0b 100644 --- a/src/mon/MonCommands.h +++ b/src/mon/MonCommands.h @@ -742,7 +742,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|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|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 d8806679bde..939f5b26535 100644 --- a/src/mon/OSDMonitor.cc +++ b/src/mon/OSDMonitor.cc @@ -2515,6 +2515,13 @@ bool OSDMonitor::preprocess_boot(MonOpRequestRef op) << " because all up OSDs are post-hammer"; 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? @@ -9367,6 +9374,21 @@ bool OSDMonitor::prepare_command_impl(MonOpRequestRef op, err = -EPERM; goto reply; } + } else if (key == "pglog_hardlimit") { + if (!osdmap.get_num_up_osds() && !sure) { + 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; + } + if (HAVE_FEATURE(osdmap.get_up_osd_features(), OSD_PGLOG_HARDLIMIT) + || sure) { + 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 8d47205b229..3b7ddfa4a40 100644 --- a/src/osd/OSDMap.cc +++ b/src/osd/OSDMap.cc @@ -3153,6 +3153,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 e160b770287..d782d897fed 100644 --- a/src/osd/PG.h +++ b/src/osd/PG.h @@ -2508,6 +2508,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 466f9b2c1cd..0074c7964bf 100644 --- a/src/osd/PrimaryLogPG.cc +++ b/src/osd/PrimaryLogPG.cc @@ -3375,7 +3375,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() && @@ -9635,7 +9638,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(); } @@ -9777,7 +9783,10 @@ void PrimaryLogPG::submit_log_entries( assert(r == 0); }); - calc_trim_to(); + if (hard_limit_pglog()) + calc_trim_to_aggressive(); + else + calc_trim_to(); } void PrimaryLogPG::cancel_log_updates()