1    	// -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*-
2    	// vim: ts=8 sw=2 smarttab
3    	
4    	#include "acconfig.h"
5    	#include "options.h"
6    	#include "common/Formatter.h"
7    	
8    	// Helpers for validators
9    	#include "include/stringify.h"
10   	#include <boost/algorithm/string.hpp>
11   	#include <boost/lexical_cast.hpp>
12   	#include <regex>
13   	
14   	// Definitions for enums
15   	#include "common/perf_counters.h"
16   	
17   	// rbd feature validation
18   	#include "librbd/Features.h"
19   	
20   	namespace {
21   	class printer : public boost::static_visitor<> {
22   	  ostream& out;
23   	public:
24   	  explicit printer(ostream& os)
25   	    : out(os) {}
26   	  template<typename T>
27   	  void operator()(const T& v) const {
28   	    out << v;
29   	  }
30   	  void operator()(boost::blank blank) const {
31   	    return;
32   	  }
33   	  void operator()(bool v) const {
34   	    out << (v ? "true" : "false");
35   	  }
36   	  void operator()(double v) const {
37   	    out << std::fixed << v << std::defaultfloat;
38   	  }
39   	  void operator()(const Option::size_t& v) const {
40   	    out << v.value;
41   	  }
42   	  void operator()(const std::chrono::seconds v) const {
43   	    out << v.count();
44   	  }
45   	};
46   	}
47   	
48   	ostream& operator<<(ostream& os, const Option::value_t& v) {
49   	  printer p{os};
50   	  v.apply_visitor(p);
51   	  return os;
52   	}
53   	
54   	void Option::dump_value(const char *field_name,
55   	    const Option::value_t &v, Formatter *f) const
56   	{
57   	  if (boost::get<boost::blank>(&v)) {
58   	    // This should be nil but Formatter doesn't allow it.
59   	    f->dump_string(field_name, "");
60   	    return;
61   	  }
62   	  switch (type) {
63   	  case TYPE_INT:
64   	    f->dump_int(field_name, boost::get<int64_t>(v)); break;
65   	  case TYPE_UINT:
66   	    f->dump_unsigned(field_name, boost::get<uint64_t>(v)); break;
67   	  case TYPE_STR:
68   	    f->dump_string(field_name, boost::get<std::string>(v)); break;
69   	  case TYPE_FLOAT:
70   	    f->dump_float(field_name, boost::get<double>(v)); break;
71   	  case TYPE_BOOL:
72   	    f->dump_bool(field_name, boost::get<bool>(v)); break;
73   	  default:
74   	    f->dump_stream(field_name) << v; break;
75   	  }
76   	}
77   	
78   	int Option::pre_validate(std::string *new_value, std::string *err) const
79   	{
80   	  if (validator) {
81   	    return validator(new_value, err);
82   	  } else {
83   	    return 0;
84   	  }
85   	}
86   	
87   	int Option::validate(const Option::value_t &new_value, std::string *err) const
88   	{
89   	  // Generic validation: min
90   	  if (!boost::get<boost::blank>(&(min))) {
91   	    if (new_value < min) {
92   	      std::ostringstream oss;
93   	      oss << "Value '" << new_value << "' is below minimum " << min;
94   	      *err = oss.str();
95   	      return -EINVAL;
96   	    }
97   	  }
98   	
99   	  // Generic validation: max
100  	  if (!boost::get<boost::blank>(&(max))) {
101  	    if (new_value > max) {
102  	      std::ostringstream oss;
103  	      oss << "Value '" << new_value << "' exceeds maximum " << max;
104  	      *err = oss.str();
105  	      return -EINVAL;
106  	    }
107  	  }
108  	
109  	  // Generic validation: enum
110  	  if (!enum_allowed.empty() && type == Option::TYPE_STR) {
(1) Event fun_call_w_exception: Called function throws an exception of type "boost::exception_detail::clone_impl<boost::exception_detail::error_info_injector<boost::bad_get> >". [details]
111  	    auto found = std::find(enum_allowed.begin(), enum_allowed.end(),
112  	                           boost::get<std::string>(new_value));
113  	    if (found == enum_allowed.end()) {
114  	      std::ostringstream oss;
115  	      oss << "'" << new_value << "' is not one of the permitted "
116  	                 "values: " << joinify(enum_allowed.begin(),
117  	                                       enum_allowed.end(),
118  	                                       std::string(", "));
119  	      *err = oss.str();
120  	      return -EINVAL;
121  	    }
122  	  }
123  	
124  	  return 0;
125  	}
126  	
127  	int Option::parse_value(
128  	  const std::string& raw_val,
129  	  value_t *out,
130  	  std::string *error_message,
131  	  std::string *normalized_value) const
132  	{
133  	  std::string val = raw_val;
134  	
135  	  int r = pre_validate(&val, error_message);
136  	  if (r != 0) {
137  	    return r;
138  	  }
139  	
140  	  if (type == Option::TYPE_INT) {
141  	    int64_t f = strict_si_cast<int64_t>(val.c_str(), error_message);
142  	    if (!error_message->empty()) {
143  	      return -EINVAL;
144  	    }
145  	    *out = f;
146  	  } else if (type == Option::TYPE_UINT) {
147  	    uint64_t f = strict_si_cast<uint64_t>(val.c_str(), error_message);
148  	    if (!error_message->empty()) {
149  	      return -EINVAL;
150  	    }
151  	    *out = f;
152  	  } else if (type == Option::TYPE_STR) {
153  	    *out = val;
154  	  } else if (type == Option::TYPE_FLOAT) {
155  	    double f = strict_strtod(val.c_str(), error_message);
156  	    if (!error_message->empty()) {
157  	      return -EINVAL;
158  	    } else {
159  	      *out = f;
160  	    }
161  	  } else if (type == Option::TYPE_BOOL) {
162  	    if (strcasecmp(val.c_str(), "false") == 0) {
163  	      *out = false;
164  	    } else if (strcasecmp(val.c_str(), "true") == 0) {
165  	      *out = true;
166  	    } else {
167  	      int b = strict_strtol(val.c_str(), 10, error_message);
168  	      if (!error_message->empty()) {
169  		return -EINVAL;
170  	      }
171  	      *out = (bool)!!b;
172  	    }
173  	  } else if (type == Option::TYPE_ADDR) {
174  	    entity_addr_t addr;
175  	    if (!addr.parse(val.c_str())){
176  	      return -EINVAL;
177  	    }
178  	    *out = addr;
179  	  } else if (type == Option::TYPE_ADDR) {
180  	    entity_addrvec_t addr;
181  	    if (!addr.parse(val.c_str())){
182  	      return -EINVAL;
183  	    }
184  	    *out = addr;
185  	  } else if (type == Option::TYPE_UUID) {
186  	    uuid_d uuid;
187  	    if (!uuid.parse(val.c_str())) {
188  	      return -EINVAL;
189  	    }
190  	    *out = uuid;
191  	  } else if (type == Option::TYPE_SIZE) {
192  	    Option::size_t sz{strict_iecstrtoll(val.c_str(), error_message)};
193  	    if (!error_message->empty()) {
194  	      return -EINVAL;
195  	    }
196  	    *out = sz;
197  	  } else if (type == Option::TYPE_SECS) {
198  	    try {
199  	      *out = parse_timespan(val);
200  	    } catch (const invalid_argument& e) {
201  	      *error_message = e.what();
202  	      return -EINVAL;
203  	    }
204  	  } else {
205  	    ceph_abort();
206  	  }
207  	
(1) Event fun_call_w_exception: Called function throws an exception of type "boost::exception_detail::clone_impl<boost::exception_detail::error_info_injector<boost::bad_get> >". [details]
208  	  r = validate(*out, error_message);
209  	  if (r != 0) {
210  	    return r;
211  	  }
212  	
213  	  if (normalized_value) {
214  	    *normalized_value = to_str(*out);
215  	  }
216  	  return 0;
217  	}
218  	
219  	void Option::dump(Formatter *f) const
220  	{
221  	  f->dump_string("name", name);
222  	
223  	  f->dump_string("type", type_to_str(type));
224  	
225  	  f->dump_string("level", level_to_str(level));
226  	
227  	  f->dump_string("desc", desc);
228  	  f->dump_string("long_desc", long_desc);
229  	
230  	  dump_value("default", value, f);
231  	  dump_value("daemon_default", daemon_value, f);
232  	
233  	  f->open_array_section("tags");
234  	  for (const auto t : tags) {
235  	    f->dump_string("tag", t);
236  	  }
237  	  f->close_section();
238  	
239  	  f->open_array_section("services");
240  	  for (const auto s : services) {
241  	    f->dump_string("service", s);
242  	  }
243  	  f->close_section();
244  	
245  	  f->open_array_section("see_also");
246  	  for (const auto sa : see_also) {
247  	    f->dump_string("see_also", sa);
248  	  }
249  	  f->close_section();
250  	
251  	  if (type == TYPE_STR) {
252  	    f->open_array_section("enum_values");
253  	    for (const auto &ea : enum_allowed) {
254  	      f->dump_string("enum_value", ea);
255  	    }
256  	    f->close_section();
257  	  }
258  	
259  	  dump_value("min", min, f);
260  	  dump_value("max", max, f);
261  	
262  	  f->dump_bool("can_update_at_runtime", can_update_at_runtime());
263  	
264  	  f->open_array_section("flags");
265  	  if (has_flag(FLAG_RUNTIME)) {
266  	    f->dump_string("option", "runtime");
267  	  }
268  	  if (has_flag(FLAG_NO_MON_UPDATE)) {
269  	    f->dump_string("option", "no_mon_update");
270  	  }
271  	  if (has_flag(FLAG_STARTUP)) {
272  	    f->dump_string("option", "startup");
273  	  }
274  	  if (has_flag(FLAG_CLUSTER_CREATE)) {
275  	    f->dump_string("option", "cluster_create");
276  	  }
277  	  if (has_flag(FLAG_CREATE)) {
278  	    f->dump_string("option", "create");
279  	  }
280  	  f->close_section();
281  	}
282  	
283  	std::string Option::to_str(const Option::value_t& v)
284  	{
285  	  return stringify(v);
286  	}
287  	
288  	void Option::print(ostream *out) const
289  	{
290  	  *out << name << " - " << desc << "\n";
291  	  *out << "  (" << type_to_str(type) << ", " << level_to_str(level) << ")\n";
292  	  if (!boost::get<boost::blank>(&daemon_value)) {
293  	    *out << "  Default (non-daemon): " << stringify(value) << "\n";
294  	    *out << "  Default (daemon): " << stringify(daemon_value) << "\n";
295  	  } else {
296  	    *out << "  Default: " << stringify(value) << "\n";
297  	  }
298  	  if (!enum_allowed.empty()) {
299  	    *out << "  Possible values: ";
300  	    for (auto& i : enum_allowed) {
301  	      *out << " " << stringify(i);
302  	    }
303  	    *out << "\n";
304  	  }
305  	  if (!boost::get<boost::blank>(&min)) {
306  	    *out << "  Minimum: " << stringify(min) << "\n"
307  		 << "  Maximum: " << stringify(max) << "\n";
308  	  }
309  	  *out << "  Can update at runtime: "
310  	       << (can_update_at_runtime() ? "true" : "false") << "\n";
311  	  if (!services.empty()) {
312  	    *out << "  Services: " << services << "\n";
313  	  }
314  	  if (!tags.empty()) {
315  	    *out << "  Tags: " << tags << "\n";
316  	  }
317  	  if (!see_also.empty()) {
318  	    *out << "  See also: " << see_also << "\n";
319  	  }
320  	
321  	  if (long_desc.size()) {
322  	    *out << "\n" << long_desc << "\n";
323  	  }
324  	}
325  	
326  	constexpr unsigned long long operator"" _min (unsigned long long min) {
327  	  return min * 60;
328  	}
329  	constexpr unsigned long long operator"" _hr (unsigned long long hr) {
330  	  return hr * 60 * 60;
331  	}
332  	constexpr unsigned long long operator"" _day (unsigned long long day) {
333  	  return day * 60 * 60 * 24;
334  	}
335  	constexpr unsigned long long operator"" _K (unsigned long long n) {
336  	  return n << 10;
337  	}
338  	constexpr unsigned long long operator"" _M (unsigned long long n) {
339  	  return n << 20;
340  	}
341  	constexpr unsigned long long operator"" _G (unsigned long long n) {
342  	  return n << 30;
343  	}
344  	constexpr unsigned long long operator"" _T (unsigned long long n) {
345  	  return n << 40;
346  	}
347  	
348  	std::vector<Option> get_global_options() {
349  	  return std::vector<Option>({
350  	    Option("host", Option::TYPE_STR, Option::LEVEL_BASIC)
351  	    .set_description("local hostname")
352  	    .set_long_description("if blank, ceph assumes the short hostname (hostname -s)")
353  	    .set_flag(Option::FLAG_NO_MON_UPDATE)
354  	    .add_service("common")
355  	    .add_tag("network"),
356  	
357  	    Option("fsid", Option::TYPE_UUID, Option::LEVEL_BASIC)
358  	    .set_description("cluster fsid (uuid)")
359  	    .set_flag(Option::FLAG_NO_MON_UPDATE)
360  	    .set_flag(Option::FLAG_STARTUP)
361  	    .add_service("common")
362  	    .add_tag("service"),
363  	
364  	    Option("public_addr", Option::TYPE_ADDR, Option::LEVEL_BASIC)
365  	    .set_description("public-facing address to bind to")
366  	    .set_flag(Option::FLAG_STARTUP)
367  	    .add_service({"mon", "mds", "osd", "mgr"}),
368  	
369  	    Option("public_bind_addr", Option::TYPE_ADDR, Option::LEVEL_ADVANCED)
370  	    .set_default(entity_addr_t())
371  	    .set_flag(Option::FLAG_STARTUP)
372  	    .add_service("mon")
373  	    .set_description(""),
374  	
375  	    Option("cluster_addr", Option::TYPE_ADDR, Option::LEVEL_BASIC)
376  	    .set_description("cluster-facing address to bind to")
377  	    .add_service("osd")
378  	    .set_flag(Option::FLAG_STARTUP)
379  	    .add_tag("network"),
380  	
381  	    Option("public_network", Option::TYPE_STR, Option::LEVEL_ADVANCED)
382  	    .add_service({"mon", "mds", "osd", "mgr"})
383  	    .set_flag(Option::FLAG_STARTUP)
384  	    .add_tag("network")
385  	    .set_description("Network(s) from which to choose a public address to bind to"),
386  	
387  	    Option("public_network_interface", Option::TYPE_STR, Option::LEVEL_ADVANCED)
388  	    .add_service({"mon", "mds", "osd", "mgr"})
389  	    .add_tag("network")
390  	    .set_flag(Option::FLAG_STARTUP)
391  	    .set_description("Interface name(s) from which to choose an address from a public_network to bind to; public_network must also be specified.")
392  	    .add_see_also("public_network"),
393  	
394  	    Option("cluster_network", Option::TYPE_STR, Option::LEVEL_ADVANCED)
395  	    .add_service("osd")
396  	    .set_flag(Option::FLAG_STARTUP)
397  	    .add_tag("network")
398  	    .set_description("Network(s) from which to choose a cluster address to bind to"),
399  	
400  	    Option("cluster_network_interface", Option::TYPE_STR, Option::LEVEL_ADVANCED)
401  	    .add_service({"mon", "mds", "osd", "mgr"})
402  	    .set_flag(Option::FLAG_STARTUP)
403  	    .add_tag("network")
404  	    .set_description("Interface name(s) from which to choose an address from a cluster_network to bind to; cluster_network must also be specified.")
405  	    .add_see_also("cluster_network"),
406  	
407  	    Option("monmap", Option::TYPE_STR, Option::LEVEL_ADVANCED)
408  	    .set_description("path to MonMap file")
409  	    .set_long_description("This option is normally used during mkfs, but can also "
410  	  			"be used to identify which monitors to connect to.")
411  	    .set_flag(Option::FLAG_NO_MON_UPDATE)
412  	    .add_service("mon")
413  	    .set_flag(Option::FLAG_CREATE),
414  	
415  	    Option("mon_host", Option::TYPE_STR, Option::LEVEL_BASIC)
416  	    .set_description("list of hosts or addresses to search for a monitor")
417  	    .set_long_description("This is a comma, whitespace, or semicolon separated "
418  	  			"list of IP addresses or hostnames. Hostnames are "
419  	  			"resolved via DNS and all A or AAAA records are "
420  	  			"included in the search list.")
421  	    .set_flag(Option::FLAG_NO_MON_UPDATE)
422  	    .set_flag(Option::FLAG_STARTUP)
423  	    .add_service("common"),
424  	
425  	    Option("mon_dns_srv_name", Option::TYPE_STR, Option::LEVEL_ADVANCED)
426  	    .set_default("ceph-mon")
427  	    .set_description("name of DNS SRV record to check for monitor addresses")
428  	    .set_flag(Option::FLAG_NO_MON_UPDATE)
429  	    .set_flag(Option::FLAG_STARTUP)
430  	    .add_service("common")
431  	    .add_tag("network")
432  	    .add_see_also("mon_host"),
433  	
434  	    Option("image", Option::TYPE_STR, Option::LEVEL_BASIC)
435  	    .set_description("container image (used by ssh orchestrator)")
436  	    .set_flag(Option::FLAG_STARTUP)
437  	    .set_default("ceph/daemon-base"),
438  	
439  	    // lockdep
440  	    Option("lockdep", Option::TYPE_BOOL, Option::LEVEL_DEV)
441  	    .set_description("enable lockdep lock dependency analyzer")
442  	    .set_flag(Option::FLAG_NO_MON_UPDATE)
443  	    .set_flag(Option::FLAG_STARTUP)
444  	    .add_service("common"),
445  	
446  	    Option("lockdep_force_backtrace", Option::TYPE_BOOL, Option::LEVEL_DEV)
447  	    .set_description("always gather current backtrace at every lock")
448  	    .set_flag(Option::FLAG_STARTUP)
449  	    .add_service("common")
450  	    .add_see_also("lockdep"),
451  	
452  	    Option("run_dir", Option::TYPE_STR, Option::LEVEL_ADVANCED)
453  	    .set_default("/var/run/ceph")
454  	    .set_flag(Option::FLAG_STARTUP)
455  	    .set_description("path for the 'run' directory for storing pid and socket files")
456  	    .add_service("common")
457  	    .add_see_also("admin_socket"),
458  	
459  	    Option("admin_socket", Option::TYPE_STR, Option::LEVEL_ADVANCED)
460  	    .set_default("")
461  	    .set_daemon_default("$run_dir/$cluster-$name.asok")
462  	    .set_flag(Option::FLAG_STARTUP)
463  	    .set_description("path for the runtime control socket file, used by the 'ceph daemon' command")
464  	    .add_service("common"),
465  	
466  	    Option("admin_socket_mode", Option::TYPE_STR, Option::LEVEL_ADVANCED)
467  	    .set_description("file mode to set for the admin socket file, e.g, '0755'")
468  	    .set_flag(Option::FLAG_STARTUP)
469  	    .add_service("common")
470  	    .add_see_also("admin_socket"),
471  	
472  	    // daemon
473  	    Option("daemonize", Option::TYPE_BOOL, Option::LEVEL_ADVANCED)
474  	    .set_default(false)
475  	    .set_daemon_default(true)
476  	    .set_description("whether to daemonize (background) after startup")
477  	    .set_flag(Option::FLAG_STARTUP)
478  	    .set_flag(Option::FLAG_NO_MON_UPDATE)
479  	    .add_service({"mon", "mgr", "osd", "mds"})
480  	    .add_tag("service")
481  	    .add_see_also({"pid_file", "chdir"}),
482  	
483  	    Option("setuser", Option::TYPE_STR, Option::LEVEL_ADVANCED)
484  	    .set_flag(Option::FLAG_STARTUP)
485  	    .set_description("uid or user name to switch to on startup")
486  	    .set_long_description("This is normally specified by the systemd unit file.")
487  	    .add_service({"mon", "mgr", "osd", "mds"})
488  	    .add_tag("service")
489  	    .add_see_also("setgroup"),
490  	
491  	    Option("setgroup", Option::TYPE_STR, Option::LEVEL_ADVANCED)
492  	    .set_flag(Option::FLAG_STARTUP)
493  	    .set_description("gid or group name to switch to on startup")
494  	    .set_long_description("This is normally specified by the systemd unit file.")
495  	    .add_service({"mon", "mgr", "osd", "mds"})
496  	    .add_tag("service")
497  	    .add_see_also("setuser"),
498  	
499  	    Option("setuser_match_path", Option::TYPE_STR, Option::LEVEL_ADVANCED)
500  	    .set_flag(Option::FLAG_STARTUP)
501  	    .set_description("if set, setuser/setgroup is condition on this path matching ownership")
502  	    .set_long_description("If setuser or setgroup are specified, and this option is non-empty, then the uid/gid of the daemon will only be changed if the file or directory specified by this option has a matching uid and/or gid.  This exists primarily to allow switching to user ceph for OSDs to be conditional on whether the osd data contents have also been chowned after an upgrade.  This is normally specified by the systemd unit file.")
503  	    .add_service({"mon", "mgr", "osd", "mds"})
504  	    .add_tag("service")
505  	    .add_see_also({"setuser", "setgroup"}),
506  	
507  	    Option("pid_file", Option::TYPE_STR, Option::LEVEL_ADVANCED)
508  	    .set_flag(Option::FLAG_STARTUP)
509  	    .set_description("path to write a pid file (if any)")
510  	    .add_service({"mon", "mgr", "osd", "mds"})
511  	    .add_tag("service"),
512  	
513  	    Option("chdir", Option::TYPE_STR, Option::LEVEL_ADVANCED)
514  	    .set_description("path to chdir(2) to after daemonizing")
515  	    .set_flag(Option::FLAG_STARTUP)
516  	    .set_flag(Option::FLAG_NO_MON_UPDATE)
517  	    .add_service({"mon", "mgr", "osd", "mds"})
518  	    .add_tag("service")
519  	    .add_see_also("daemonize"),
520  	
521  	    Option("fatal_signal_handlers", Option::TYPE_BOOL, Option::LEVEL_ADVANCED)
522  	    .set_default(true)
523  	    .set_flag(Option::FLAG_STARTUP)
524  	    .set_description("whether to register signal handlers for SIGABRT etc that dump a stack trace")
525  	    .set_long_description("This is normally true for daemons and values for libraries.")
526  	    .add_service({"mon", "mgr", "osd", "mds"})
527  	    .add_tag("service"),
528  	
529  	    Option("crash_dir", Option::TYPE_STR, Option::LEVEL_ADVANCED)
530  	    .set_flag(Option::FLAG_STARTUP)
531  	    .set_default("/var/lib/ceph/crash")
532  	    .set_description("Directory where crash reports are archived"),
533  	
534  	    // restapi
535  	    Option("restapi_log_level", Option::TYPE_STR, Option::LEVEL_ADVANCED)
536  	    .set_description("default set by python code"),
537  	
538  	    Option("restapi_base_url", Option::TYPE_STR, Option::LEVEL_ADVANCED)
539  	    .set_description("default set by python code"),
540  	
541  	    Option("erasure_code_dir", Option::TYPE_STR, Option::LEVEL_ADVANCED)
542  	    .set_default(CEPH_PKGLIBDIR"/erasure-code")
543  	    .set_flag(Option::FLAG_STARTUP)
544  	    .set_description("directory where erasure-code plugins can be found")
545  	    .add_service({"mon", "osd"}),
546  	
547  	    // logging
548  	    Option("log_file", Option::TYPE_STR, Option::LEVEL_BASIC)
549  	    .set_default("")
550  	    .set_daemon_default("/var/log/ceph/$cluster-$name.log")
551  	    .set_description("path to log file")
552  	    .add_see_also({"log_to_file",
553  			   "log_to_stderr",
554  	                   "err_to_stderr",
555  	                   "log_to_syslog",
556  	                   "err_to_syslog"}),
557  	
558  	    Option("log_max_new", Option::TYPE_INT, Option::LEVEL_ADVANCED)
559  	    .set_default(1000)
560  	    .set_description("max unwritten log entries to allow before waiting to flush to the log")
561  	    .add_see_also("log_max_recent"),
562  	
563  	    Option("log_max_recent", Option::TYPE_INT, Option::LEVEL_ADVANCED)
564  	    .set_default(500)
565  	    .set_daemon_default(10000)
566  	    .set_description("recent log entries to keep in memory to dump in the event of a crash")
567  	    .set_long_description("The purpose of this option is to log at a higher debug level only to the in-memory buffer, and write out the detailed log messages only if there is a crash.  Only log entries below the lower log level will be written unconditionally to the log.  For example, debug_osd=1/5 will write everything <= 1 to the log unconditionally but keep entries at levels 2-5 in memory.  If there is a seg fault or assertion failure, all entries will be dumped to the log."),
568  	
569  	    Option("log_to_file", Option::TYPE_BOOL, Option::LEVEL_BASIC)
570  	    .set_default(true)
571  	    .set_description("send log lines to a file")
572  	    .add_see_also("log_file"),
573  	
574  	    Option("log_to_stderr", Option::TYPE_BOOL, Option::LEVEL_BASIC)
575  	    .set_default(true)
576  	    .set_daemon_default(false)
577  	    .set_description("send log lines to stderr"),
578  	
579  	    Option("err_to_stderr", Option::TYPE_BOOL, Option::LEVEL_BASIC)
580  	    .set_default(false)
581  	    .set_daemon_default(true)
582  	    .set_description("send critical error log lines to stderr"),
583  	
584  	    Option("log_stderr_prefix", Option::TYPE_STR, Option::LEVEL_ADVANCED)
585  	    .set_description("String to prefix log messages with when sent to stderr")
586  	    .set_long_description("This is useful in container environments when combined with mon_cluster_log_to_stderr.  The mon log prefixes each line with the channel name (e.g., 'default', 'audit'), while log_stderr_prefix can be set to 'debug '.")
587  	    .add_see_also("mon_cluster_log_to_stderr"),
588  	
589  	    Option("log_to_syslog", Option::TYPE_BOOL, Option::LEVEL_BASIC)
590  	    .set_default(false)
591  	    .set_description("send log lines to syslog facility"),
592  	
593  	    Option("err_to_syslog", Option::TYPE_BOOL, Option::LEVEL_BASIC)
594  	    .set_default(false)
595  	    .set_description("send critical error log lines to syslog facility"),
596  	
597  	    Option("log_flush_on_exit", Option::TYPE_BOOL, Option::LEVEL_ADVANCED)
598  	    .set_default(false)
599  	    .set_description("set a process exit handler to ensure the log is flushed on exit"),
600  	
601  	    Option("log_stop_at_utilization", Option::TYPE_FLOAT, Option::LEVEL_BASIC)
602  	    .set_default(.97)
603  	    .set_min_max(0.0, 1.0)
604  	    .set_description("stop writing to the log file when device utilization reaches this ratio")
605  	    .add_see_also("log_file"),
606  	
607  	    Option("log_to_graylog", Option::TYPE_BOOL, Option::LEVEL_BASIC)
608  	    .set_default(false)
609  	    .set_description("send log lines to remote graylog server")
610  	    .add_see_also({"err_to_graylog",
611  	                   "log_graylog_host",
612  	                   "log_graylog_port"}),
613  	
614  	    Option("err_to_graylog", Option::TYPE_BOOL, Option::LEVEL_BASIC)
615  	    .set_default(false)
616  	    .set_description("send critical error log lines to remote graylog server")
617  	    .add_see_also({"log_to_graylog",
618  	                   "log_graylog_host",
619  	                   "log_graylog_port"}),
620  	
621  	    Option("log_graylog_host", Option::TYPE_STR, Option::LEVEL_BASIC)
622  	    .set_default("127.0.0.1")
623  	    .set_description("address or hostname of graylog server to log to")
624  	    .add_see_also({"log_to_graylog",
625  	                   "err_to_graylog",
626  	                   "log_graylog_port"}),
627  	
628  	    Option("log_graylog_port", Option::TYPE_INT, Option::LEVEL_BASIC)
629  	    .set_default(12201)
630  	    .set_description("port number for the remote graylog server")
631  	    .add_see_also("log_graylog_host"),
632  	
633  	    Option("log_coarse_timestamps", Option::TYPE_BOOL, Option::LEVEL_ADVANCED)
634  	    .set_default(true)
635  	    .set_description("timestamp log entries from coarse system clock "
636  			     "to improve performance")
637  	    .add_service("common")
638  	    .add_tag("performance")
639  	    .add_tag("service"),
640  	
641  	
642  	    // unmodified
643  	    Option("clog_to_monitors", Option::TYPE_STR, Option::LEVEL_ADVANCED)
644  	    .set_default("default=true")
645  	    .set_flag(Option::FLAG_RUNTIME)
646  	    .set_description("Make daemons send cluster log messages to monitors"),
647  	
648  	    Option("clog_to_syslog", Option::TYPE_STR, Option::LEVEL_ADVANCED)
649  	    .set_default("false")
650  	    .set_flag(Option::FLAG_RUNTIME)
651  	    .set_description("Make daemons send cluster log messages to syslog"),
652  	
653  	    Option("clog_to_syslog_level", Option::TYPE_STR, Option::LEVEL_ADVANCED)
654  	    .set_default("info")
655  	    .set_flag(Option::FLAG_RUNTIME)
656  	    .set_description("Syslog level for cluster log messages")
657  	    .add_see_also("clog_to_syslog"),
658  	
659  	    Option("clog_to_syslog_facility", Option::TYPE_STR, Option::LEVEL_ADVANCED)
660  	    .set_default("default=daemon audit=local0")
661  	    .set_flag(Option::FLAG_RUNTIME)
662  	    .set_description("Syslog facility for cluster log messages")
663  	    .add_see_also("clog_to_syslog"),
664  	
665  	    Option("clog_to_graylog", Option::TYPE_STR, Option::LEVEL_ADVANCED)
666  	    .set_default("false")
667  	    .set_flag(Option::FLAG_RUNTIME)
668  	    .set_description("Make daemons send cluster log to graylog"),
669  	
670  	    Option("clog_to_graylog_host", Option::TYPE_STR, Option::LEVEL_ADVANCED)
671  	    .set_default("127.0.0.1")
672  	    .set_flag(Option::FLAG_RUNTIME)
673  	    .set_description("Graylog host to cluster log messages")
674  	    .add_see_also("clog_to_graylog"),
675  	
676  	    Option("clog_to_graylog_port", Option::TYPE_STR, Option::LEVEL_ADVANCED)
677  	    .set_default("12201")
678  	    .set_flag(Option::FLAG_RUNTIME)
679  	    .set_description("Graylog port number for cluster log messages")
680  	    .add_see_also("clog_to_graylog"),
681  	
682  	    Option("mon_cluster_log_to_stderr", Option::TYPE_BOOL, Option::LEVEL_ADVANCED)
683  	    .set_default(false)
684  	    .add_service("mon")
685  	    .set_flag(Option::FLAG_RUNTIME)
686  	    .set_description("Make monitor send cluster log messages to stderr (prefixed by channel)")
687  	    .add_see_also("log_stderr_prefix"),
688  	
689  	    Option("mon_cluster_log_to_syslog", Option::TYPE_STR, Option::LEVEL_ADVANCED)
690  	    .set_default("default=false")
691  	    .set_flag(Option::FLAG_RUNTIME)
692  	    .add_service("mon")
693  	    .set_description("Make monitor send cluster log messages to syslog"),
694  	
695  	    Option("mon_cluster_log_to_syslog_level", Option::TYPE_STR, Option::LEVEL_ADVANCED)
696  	    .set_default("info")
697  	    .add_service("mon")
698  	    .set_flag(Option::FLAG_RUNTIME)
699  	    .set_description("Syslog level for cluster log messages")
700  	    .add_see_also("mon_cluster_log_to_syslog"),
701  	
702  	    Option("mon_cluster_log_to_syslog_facility", Option::TYPE_STR, Option::LEVEL_ADVANCED)
703  	    .set_default("daemon")
704  	    .add_service("mon")
705  	    .set_flag(Option::FLAG_RUNTIME)
706  	    .set_description("Syslog facility for cluster log messages")
707  	    .add_see_also("mon_cluster_log_to_syslog"),
708  	
709  	    Option("mon_cluster_log_to_file", Option::TYPE_BOOL, Option::LEVEL_ADVANCED)
710  	    .set_default(true)
711  	    .set_flag(Option::FLAG_RUNTIME)
712  	    .add_service("mon")
713  	    .set_description("Make monitor send cluster log messages to file")
714  	    .add_see_also("mon_cluster_log_file"),
715  	
716  	    Option("mon_cluster_log_file", Option::TYPE_STR, Option::LEVEL_ADVANCED)
717  	    .set_default("default=/var/log/ceph/$cluster.$channel.log cluster=/var/log/ceph/$cluster.log")
718  	    .set_flag(Option::FLAG_RUNTIME)
719  	    .add_service("mon")
720  	    .set_description("File(s) to write cluster log to")
721  	    .set_long_description("This can either be a simple file name to receive all messages, or a list of key/value pairs where the key is the log channel and the value is the filename, which may include $cluster and $channel metavariables")
722  	    .add_see_also("mon_cluster_log_to_file"),
723  	
724  	    Option("mon_cluster_log_file_level", Option::TYPE_STR, Option::LEVEL_ADVANCED)
725  	    .set_default("debug")
726  	    .set_flag(Option::FLAG_RUNTIME)
727  	    .add_service("mon")
728  	    .set_description("Lowest level to include is cluster log file")
729  	    .add_see_also("mon_cluster_log_file"),
730  	
731  	    Option("mon_cluster_log_to_graylog", Option::TYPE_STR, Option::LEVEL_ADVANCED)
732  	    .set_default("false")
733  	    .set_flag(Option::FLAG_RUNTIME)
734  	    .add_service("mon")
735  	    .set_description("Make monitor send cluster log to graylog"),
736  	
737  	    Option("mon_cluster_log_to_graylog_host", Option::TYPE_STR, Option::LEVEL_ADVANCED)
738  	    .set_default("127.0.0.1")
739  	    .set_flag(Option::FLAG_RUNTIME)
740  	    .add_service("mon")
741  	    .set_description("Graylog host for cluster log messages")
742  	    .add_see_also("mon_cluster_log_to_graylog"),
743  	
744  	    Option("mon_cluster_log_to_graylog_port", Option::TYPE_STR, Option::LEVEL_ADVANCED)
745  	    .set_default("12201")
746  	    .set_flag(Option::FLAG_RUNTIME)
747  	    .add_service("mon")
748  	    .set_description("Graylog port for cluster log messages")
749  	    .add_see_also("mon_cluster_log_to_graylog"),
750  	
751  	    Option("enable_experimental_unrecoverable_data_corrupting_features", Option::TYPE_STR, Option::LEVEL_ADVANCED)
752  	    .set_flag(Option::FLAG_RUNTIME)
753  	    .set_default("")
754  	    .set_description("Enable named (or all with '*') experimental features that may be untested, dangerous, and/or cause permanent data loss"),
755  	
756  	    Option("plugin_dir", Option::TYPE_STR, Option::LEVEL_ADVANCED)
757  	    .set_default(CEPH_PKGLIBDIR)
758  	    .set_flag(Option::FLAG_STARTUP)
759  	    .add_service({"mon", "osd"})
760  	    .set_description("Base directory for dynamically loaded plugins"),
761  	
762  	    // Compressor
763  	    Option("compressor_zlib_isal", Option::TYPE_BOOL, Option::LEVEL_ADVANCED)
764  	    .set_default(false)
765  	    .set_description("Use Intel ISA-L accelerated zlib implementation if available"),
766  	
767  	    Option("compressor_zlib_level", Option::TYPE_INT, Option::LEVEL_ADVANCED)
768  	    .set_default(5)
769  	    .set_description("Zlib compression level to use"),
770  	
771  	    Option("qat_compressor_enabled", Option::TYPE_BOOL, Option::LEVEL_ADVANCED)
772  	    .set_default(false)
773  	    .set_description("Enable Intel QAT acceleration support for compression if available"),
774  	
775  	    Option("plugin_crypto_accelerator", Option::TYPE_STR, Option::LEVEL_ADVANCED)
776  	    .set_default("crypto_isal")
777  	    .set_description("Crypto accelerator library to use"),
778  	
779  	    Option("mempool_debug", Option::TYPE_BOOL, Option::LEVEL_DEV)
780  	    .set_default(false)
781  	    .set_flag(Option::FLAG_NO_MON_UPDATE)
782  	    .set_description(""),
783  	
784  	    Option("key", Option::TYPE_STR, Option::LEVEL_ADVANCED)
785  	    .set_default("")
786  	    .set_description("Authentication key")
787  	    .set_long_description("A CephX authentication key, base64 encoded.  It normally looks something like 'AQAtut9ZdMbNJBAAHz6yBAWyJyz2yYRyeMWDag=='.")
788  	    .set_flag(Option::FLAG_STARTUP)
789  	    .set_flag(Option::FLAG_NO_MON_UPDATE)
790  	    .add_see_also("keyfile")
791  	    .add_see_also("keyring"),
792  	
793  	    Option("keyfile", Option::TYPE_STR, Option::LEVEL_ADVANCED)
794  	    .set_default("")
795  	    .set_description("Path to a file containing a key")
796  	    .set_long_description("The file should contain a CephX authentication key and optionally a trailing newline, but nothing else.")
797  	    .set_flag(Option::FLAG_STARTUP)
798  	    .set_flag(Option::FLAG_NO_MON_UPDATE)
799  	    .add_see_also("key"),
800  	
801  	    Option("keyring", Option::TYPE_STR, Option::LEVEL_ADVANCED)
802  	    .set_default(
803  	      "/etc/ceph/$cluster.$name.keyring,/etc/ceph/$cluster.keyring,"
804  	      "/etc/ceph/keyring,/etc/ceph/keyring.bin,"
805  	  #if defined(__FreeBSD)
806  	      "/usr/local/etc/ceph/$cluster.$name.keyring,"
807  	      "/usr/local/etc/ceph/$cluster.keyring,"
808  	      "/usr/local/etc/ceph/keyring,/usr/local/etc/ceph/keyring.bin,"
809  	  #endif
810  	    )
811  	    .set_description("Path to a keyring file.")
812  	    .set_long_description("A keyring file is an INI-style formatted file where the section names are client or daemon names (e.g., 'osd.0') and each section contains a 'key' property with CephX authentication key as the value.")
813  	    .set_flag(Option::FLAG_STARTUP)
814  	    .set_flag(Option::FLAG_NO_MON_UPDATE)
815  	    .add_see_also("key")
816  	    .add_see_also("keyfile"),
817  	
818  	    Option("heartbeat_interval", Option::TYPE_INT, Option::LEVEL_ADVANCED)
819  	    .set_default(5)
820  	    .set_flag(Option::FLAG_STARTUP)
821  	    .set_description("Frequency of internal heartbeat checks (seconds)"),
822  	
823  	    Option("heartbeat_file", Option::TYPE_STR, Option::LEVEL_ADVANCED)
824  	    .set_default("")
825  	    .set_flag(Option::FLAG_STARTUP)
826  	    .set_description("File to touch on successful internal heartbeat")
827  	    .set_long_description("If set, this file will be touched every time an internal heartbeat check succeeds.")
828  	    .add_see_also("heartbeat_interval"),
829  	
830  	    Option("heartbeat_inject_failure", Option::TYPE_INT, Option::LEVEL_DEV)
831  	    .set_default(0)
832  	    .set_description(""),
833  	
834  	    Option("perf", Option::TYPE_BOOL, Option::LEVEL_ADVANCED)
835  	    .set_default(true)
836  	    .set_description("Enable internal performance metrics")
837  	    .set_long_description("If enabled, collect and expose internal health metrics"),
838  	
839  	    Option("ms_type", Option::TYPE_STR, Option::LEVEL_ADVANCED)
840  	    .set_flag(Option::FLAG_STARTUP)
841  	    .set_default("async+posix")
842  	    .set_description("Messenger implementation to use for network communication"),
843  	
844  	    Option("ms_public_type", Option::TYPE_STR, Option::LEVEL_ADVANCED)
845  	    .set_default("")
846  	    .set_flag(Option::FLAG_STARTUP)
847  	    .set_description("Messenger implementation to use for the public network")
848  	    .set_long_description("If not specified, use ms_type")
849  	    .add_see_also("ms_type"),
850  	
851  	    Option("ms_cluster_type", Option::TYPE_STR, Option::LEVEL_ADVANCED)
852  	    .set_default("")
853  	    .set_flag(Option::FLAG_STARTUP)
854  	    .set_description("Messenger implementation to use for the internal cluster network")
855  	    .set_long_description("If not specified, use ms_type")
856  	    .add_see_also("ms_type"),
857  	
858  	    Option("ms_mon_cluster_mode", Option::TYPE_STR, Option::LEVEL_BASIC)
859  	    .set_default("secure crc")
860  	    .set_flag(Option::FLAG_STARTUP)
861  	    .set_description("Connection modes (crc, secure) for intra-mon connections in order of preference")
862  	    .add_see_also("ms_mon_service_mode")
863  	    .add_see_also("ms_mon_client_mode")
864  	    .add_see_also("ms_service_mode")
865  	    .add_see_also("ms_cluster_mode")
866  	    .add_see_also("ms_client_mode"),
867  	
868  	    Option("ms_mon_service_mode", Option::TYPE_STR, Option::LEVEL_BASIC)
869  	    .set_default("secure crc")
870  	    .set_flag(Option::FLAG_STARTUP)
871  	    .set_description("Allowed connection modes (crc, secure) for connections to mons")
872  	    .add_see_also("ms_service_mode")
873  	    .add_see_also("ms_mon_cluster_mode")
874  	    .add_see_also("ms_mon_client_mode")
875  	    .add_see_also("ms_cluster_mode")
876  	    .add_see_also("ms_client_mode"),
877  	
878  	    Option("ms_mon_client_mode", Option::TYPE_STR, Option::LEVEL_BASIC)
879  	    .set_default("secure crc")
880  	    .set_flag(Option::FLAG_STARTUP)
881  	    .set_description("Connection modes (crc, secure) for connections from clients to monitors in order of preference")
882  	    .add_see_also("ms_mon_service_mode")
883  	    .add_see_also("ms_mon_cluster_mode")
884  	    .add_see_also("ms_service_mode")
885  	    .add_see_also("ms_cluster_mode")
886  	    .add_see_also("ms_client_mode"),
887  	
888  	    Option("ms_cluster_mode", Option::TYPE_STR, Option::LEVEL_BASIC)
889  	    .set_default("crc secure")
890  	    .set_flag(Option::FLAG_STARTUP)
891  	    .set_description("Connection modes (crc, secure) for intra-cluster connections in order of preference")
892  	    .add_see_also("ms_service_mode")
893  	    .add_see_also("ms_client_mode"),
894  	
895  	    Option("ms_service_mode", Option::TYPE_STR, Option::LEVEL_BASIC)
896  	    .set_default("crc secure")
897  	    .set_flag(Option::FLAG_STARTUP)
898  	    .set_description("Allowed connection modes (crc, secure) for connections to daemons")
899  	    .add_see_also("ms_cluster_mode")
900  	    .add_see_also("ms_client_mode"),
901  	
902  	    Option("ms_client_mode", Option::TYPE_STR, Option::LEVEL_BASIC)
903  	    .set_default("crc secure")
904  	    .set_flag(Option::FLAG_STARTUP)
905  	    .set_description("Connection modes (crc, secure) for connections from clients in order of preference")
906  	    .add_see_also("ms_cluster_mode")
907  	    .add_see_also("ms_service_mode"),
908  	
909  	    Option("ms_learn_addr_from_peer", Option::TYPE_BOOL, Option::LEVEL_ADVANCED)
910  	    .set_default(true)
911  	    .set_description("Learn address from what IP our first peer thinks we connect from")
912  	    .set_long_description("Use the IP address our first peer (usually a monitor) sees that we are connecting from.  This is useful if a client is behind some sort of NAT and we want to see it identified by its local (not NATed) address."),
913  	
914  	    Option("ms_tcp_nodelay", Option::TYPE_BOOL, Option::LEVEL_ADVANCED)
915  	    .set_default(true)
916  	    .set_description("Disable Nagle's algorithm and send queued network traffic immediately"),
917  	
918  	    Option("ms_tcp_rcvbuf", Option::TYPE_SIZE, Option::LEVEL_ADVANCED)
919  	    .set_default(0)
920  	    .set_description("Size of TCP socket receive buffer"),
921  	
922  	    Option("ms_tcp_prefetch_max_size", Option::TYPE_SIZE, Option::LEVEL_ADVANCED)
923  	    .set_default(4_K)
924  	    .set_description("Maximum amount of data to prefetch out of the socket receive buffer"),
925  	
926  	    Option("ms_initial_backoff", Option::TYPE_FLOAT, Option::LEVEL_ADVANCED)
927  	    .set_default(.2)
928  	    .set_description("Initial backoff after a network error is detected (seconds)"),
929  	
930  	    Option("ms_max_backoff", Option::TYPE_FLOAT, Option::LEVEL_ADVANCED)
931  	    .set_default(15.0)
932  	    .set_description("Maximum backoff after a network error before retrying (seconds)")
933  	    .add_see_also("ms_initial_backoff"),
934  	
935  	    Option("ms_crc_data", Option::TYPE_BOOL, Option::LEVEL_DEV)
936  	    .set_default(true)
937  	    .set_description("Set and/or verify crc32c checksum on data payload sent over network"),
938  	
939  	    Option("ms_crc_header", Option::TYPE_BOOL, Option::LEVEL_DEV)
940  	    .set_default(true)
941  	    .set_description("Set and/or verify crc32c checksum on header payload sent over network"),
942  	
943  	    Option("ms_die_on_bad_msg", Option::TYPE_BOOL, Option::LEVEL_DEV)
944  	    .set_default(false)
945  	    .set_description("Induce a daemon crash/exit when a bad network message is received"),
946  	
947  	    Option("ms_die_on_unhandled_msg", Option::TYPE_BOOL, Option::LEVEL_DEV)
948  	    .set_default(false)
949  	    .set_description("Induce a daemon crash/exit when an unrecognized message is received"),
950  	
951  	    Option("ms_die_on_old_message", Option::TYPE_BOOL, Option::LEVEL_DEV)
952  	    .set_default(false)
953  	    .set_description("Induce a daemon crash/exit when a old, undecodable message is received"),
954  	
955  	    Option("ms_die_on_skipped_message", Option::TYPE_BOOL, Option::LEVEL_DEV)
956  	    .set_default(false)
957  	    .set_description("Induce a daemon crash/exit if sender skips a message sequence number"),
958  	
959  	    Option("ms_die_on_bug", Option::TYPE_BOOL, Option::LEVEL_DEV)
960  	    .set_default(false)
961  	    .set_description("Induce a crash/exit on various bugs (for testing purposes)"),
962  	
963  	    Option("ms_dispatch_throttle_bytes", Option::TYPE_SIZE, Option::LEVEL_ADVANCED)
964  	    .set_default(100_M)
965  	    .set_description("Limit messages that are read off the network but still being processed"),
966  	
967  	    Option("ms_msgr2_sign_messages", Option::TYPE_BOOL, Option::LEVEL_ADVANCED)
968  	    .set_default(false)
969  	    .set_description("Sign msgr2 frames' payload")
970  	    .add_see_also("ms_msgr2_encrypt_messages"),
971  	
972  	    Option("ms_msgr2_encrypt_messages", Option::TYPE_BOOL, Option::LEVEL_ADVANCED)
973  	    .set_default(false)
974  	    .set_description("Encrypt msgr2 frames' payload")
975  	    .add_see_also("ms_msgr2_sign_messages"),
976  	
977  	    Option("ms_bind_ipv4", Option::TYPE_BOOL, Option::LEVEL_ADVANCED)
978  	    .set_default(true)
979  	    .set_description("Bind servers to IPv4 address(es)")
980  	    .add_see_also("ms_bind_ipv6"),
981  	
982  	    Option("ms_bind_ipv6", Option::TYPE_BOOL, Option::LEVEL_ADVANCED)
983  	    .set_default(false)
984  	    .set_description("Bind servers to IPv6 address(es)")
985  	    .add_see_also("ms_bind_ipv4"),
986  	
987  	    Option("ms_bind_prefer_ipv4", Option::TYPE_BOOL, Option::LEVEL_ADVANCED)
988  	    .set_default(false)
989  	    .set_description("Prefer IPV4 over IPV6 address(es)"),
990  	
991  	    Option("ms_bind_msgr1", Option::TYPE_BOOL, Option::LEVEL_ADVANCED)
992  	    .set_default(true)
993  	    .set_description("Bind servers to msgr1 (legacy) protocol address(es)")
994  	    .add_see_also("ms_bind_msgr2"),
995  	
996  	    Option("ms_bind_msgr2", Option::TYPE_BOOL, Option::LEVEL_ADVANCED)
997  	    .set_default(true)
998  	    .set_description("Bind servers to msgr2 (nautilus+) protocol address(es)")
999  	    .add_see_also("ms_bind_msgr1"),
1000 	
1001 	    Option("ms_bind_port_min", Option::TYPE_INT, Option::LEVEL_ADVANCED)
1002 	    .set_default(6800)
1003 	    .set_description("Lowest port number to bind daemon(s) to"),
1004 	
1005 	    Option("ms_bind_port_max", Option::TYPE_INT, Option::LEVEL_ADVANCED)
1006 	    .set_default(7300)
1007 	    .set_description("Highest port number to bind daemon(s) to"),
1008 	
1009 	    Option("ms_bind_retry_count", Option::TYPE_INT, Option::LEVEL_ADVANCED)
1010 	  #if !defined(__FreeBSD__)
1011 	    .set_default(3)
1012 	  #else
1013 	    // FreeBSD does not use SO_REAUSEADDR so allow for a bit more time per default
1014 	    .set_default(6)
1015 	  #endif
1016 	    .set_description("Number of attempts to make while bind(2)ing to a port"),
1017 	
1018 	    Option("ms_bind_retry_delay", Option::TYPE_INT, Option::LEVEL_ADVANCED)
1019 	  #if !defined(__FreeBSD__)
1020 	    .set_default(5)
1021 	  #else
1022 	    // FreeBSD does not use SO_REAUSEADDR so allow for a bit more time per default
1023 	    .set_default(6)
1024 	  #endif
1025 	    .set_description("Delay between bind(2) attempts (seconds)"),
1026 	
1027 	    Option("ms_bind_before_connect", Option::TYPE_BOOL, Option::LEVEL_ADVANCED)
1028 	    .set_default(false)
1029 	    .set_description("Call bind(2) on client sockets"),
1030 	
1031 	    Option("ms_tcp_listen_backlog", Option::TYPE_INT, Option::LEVEL_ADVANCED)
1032 	    .set_default(512)
1033 	    .set_description("Size of queue of incoming connections for accept(2)"),
1034 	
1035 	
1036 	    Option("ms_connection_ready_timeout", Option::TYPE_UINT, Option::LEVEL_ADVANCED)
1037 	    .set_default(10)
1038 	    .set_description("Time before we declare a not yet ready connection as dead (seconds)"),
1039 	
1040 	    Option("ms_connection_idle_timeout", Option::TYPE_UINT, Option::LEVEL_ADVANCED)
1041 	    .set_default(900)
1042 	    .set_description("Time before an idle connection is closed (seconds)"),
1043 	
1044 	    Option("ms_pq_max_tokens_per_priority", Option::TYPE_UINT, Option::LEVEL_DEV)
1045 	    .set_default(16777216)
1046 	    .set_description(""),
1047 	
1048 	    Option("ms_pq_min_cost", Option::TYPE_SIZE, Option::LEVEL_DEV)
1049 	    .set_default(65536)
1050 	    .set_description(""),
1051 	
1052 	    Option("ms_inject_socket_failures", Option::TYPE_UINT, Option::LEVEL_DEV)
1053 	    .set_default(0)
1054 	    .set_description("Inject a socket failure every Nth socket operation"),
1055 	
1056 	    Option("ms_inject_delay_type", Option::TYPE_STR, Option::LEVEL_DEV)
1057 	    .set_default("")
1058 	    .set_description("Entity type to inject delays for")
1059 	    .set_flag(Option::FLAG_RUNTIME),
1060 	
1061 	    Option("ms_inject_delay_msg_type", Option::TYPE_STR, Option::LEVEL_DEV)
1062 	    .set_default("")
1063 	    .set_description("Message type to inject delays for"),
1064 	
1065 	    Option("ms_inject_delay_max", Option::TYPE_FLOAT, Option::LEVEL_DEV)
1066 	    .set_default(1)
1067 	    .set_description("Max delay to inject"),
1068 	
1069 	    Option("ms_inject_delay_probability", Option::TYPE_FLOAT, Option::LEVEL_DEV)
1070 	    .set_default(0)
1071 	    .set_description(""),
1072 	
1073 	    Option("ms_inject_internal_delays", Option::TYPE_FLOAT, Option::LEVEL_DEV)
1074 	    .set_default(0)
1075 	    .set_description("Inject various internal delays to induce races (seconds)"),
1076 	
1077 	    Option("ms_blackhole_osd", Option::TYPE_BOOL, Option::LEVEL_DEV)
1078 	    .set_default(false)
1079 	    .set_description(""),
1080 	
1081 	    Option("ms_blackhole_mon", Option::TYPE_BOOL, Option::LEVEL_DEV)
1082 	    .set_default(false)
1083 	    .set_description(""),
1084 	
1085 	    Option("ms_blackhole_mds", Option::TYPE_BOOL, Option::LEVEL_DEV)
1086 	    .set_default(false)
1087 	    .set_description(""),
1088 	
1089 	    Option("ms_blackhole_mgr", Option::TYPE_BOOL, Option::LEVEL_DEV)
1090 	    .set_default(false)
1091 	    .set_description(""),
1092 	
1093 	    Option("ms_blackhole_client", Option::TYPE_BOOL, Option::LEVEL_DEV)
1094 	    .set_default(false)
1095 	    .set_description(""),
1096 	
1097 	    Option("ms_dump_on_send", Option::TYPE_BOOL, Option::LEVEL_ADVANCED)
1098 	    .set_default(false)
1099 	    .set_description("Hexdump message to debug log on message send"),
1100 	
1101 	    Option("ms_dump_corrupt_message_level", Option::TYPE_INT, Option::LEVEL_ADVANCED)
1102 	    .set_default(1)
1103 	    .set_description("Log level at which to hexdump corrupt messages we receive"),
1104 	
1105 	    Option("ms_async_op_threads", Option::TYPE_UINT, Option::LEVEL_ADVANCED)
1106 	    .set_default(3)
1107 	    .set_min_max(1, 24)
1108 	    .set_description("Threadpool size for AsyncMessenger (ms_type=async)"),
1109 	
1110 	    Option("ms_async_max_op_threads", Option::TYPE_UINT, Option::LEVEL_ADVANCED)
1111 	    .set_default(5)
1112 	    .set_description("Maximum threadpool size of AsyncMessenger")
1113 	    .add_see_also("ms_async_op_threads"),
1114 	
1115 	    Option("ms_async_rdma_device_name", Option::TYPE_STR, Option::LEVEL_ADVANCED)
1116 	    .set_default("")
1117 	    .set_description(""),
1118 	
1119 	    Option("ms_async_rdma_enable_hugepage", Option::TYPE_BOOL, Option::LEVEL_ADVANCED)
1120 	    .set_default(false)
1121 	    .set_description(""),
1122 	
1123 	    Option("ms_async_rdma_buffer_size", Option::TYPE_SIZE, Option::LEVEL_ADVANCED)
1124 	    .set_default(128_K)
1125 	    .set_description(""),
1126 	
1127 	    Option("ms_async_rdma_send_buffers", Option::TYPE_UINT, Option::LEVEL_ADVANCED)
1128 	    .set_default(1_K)
1129 	    .set_description(""),
1130 	
1131 	    Option("ms_async_rdma_receive_buffers", Option::TYPE_UINT, Option::LEVEL_ADVANCED)
1132 	    .set_default(32768)
1133 	    .set_description(""),
1134 	
1135 	    Option("ms_async_rdma_receive_queue_len", Option::TYPE_UINT, Option::LEVEL_ADVANCED)
1136 	    .set_default(4096)
1137 	    .set_description(""),
1138 	
1139 	    Option("ms_async_rdma_support_srq", Option::TYPE_BOOL, Option::LEVEL_ADVANCED)
1140 	    .set_default(true)
1141 	    .set_description(""),
1142 	
1143 	    Option("ms_async_rdma_port_num", Option::TYPE_UINT, Option::LEVEL_ADVANCED)
1144 	    .set_default(1)
1145 	    .set_description(""),
1146 	
1147 	    Option("ms_async_rdma_polling_us", Option::TYPE_UINT, Option::LEVEL_ADVANCED)
1148 	    .set_default(1000)
1149 	    .set_description(""),
1150 	
1151 	    Option("ms_async_rdma_local_gid", Option::TYPE_STR, Option::LEVEL_ADVANCED)
1152 	    .set_default("")
1153 	    .set_description(""),
1154 	
1155 	    Option("ms_async_rdma_roce_ver", Option::TYPE_INT, Option::LEVEL_ADVANCED)
1156 	    .set_default(1)
1157 	    .set_description(""),
1158 	
1159 	    Option("ms_async_rdma_sl", Option::TYPE_INT, Option::LEVEL_ADVANCED)
1160 	    .set_default(3)
1161 	    .set_description(""),
1162 	
1163 	    Option("ms_async_rdma_dscp", Option::TYPE_INT, Option::LEVEL_ADVANCED)
1164 	    .set_default(96)
1165 	    .set_description(""),
1166 	
1167 	    Option("ms_max_accept_failures", Option::TYPE_INT, Option::LEVEL_ADVANCED)
1168 	    .set_default(4)
1169 	    .set_description("The maximum number of consecutive failed accept() calls before "
1170 	                     "considering the daemon is misconfigured and abort it."),
1171 	
1172 	    Option("ms_async_rdma_cm", Option::TYPE_BOOL, Option::LEVEL_ADVANCED)
1173 	    .set_default(false)
1174 	    .set_description(""),
1175 	
1176 	    Option("ms_async_rdma_type", Option::TYPE_STR, Option::LEVEL_ADVANCED)
1177 	    .set_default("ib")
1178 	    .set_description(""),
1179 	
1180 	    Option("ms_dpdk_port_id", Option::TYPE_INT, Option::LEVEL_ADVANCED)
1181 	    .set_default(0)
1182 	    .set_description(""),
1183 	
1184 	    Option("ms_dpdk_coremask", Option::TYPE_STR, Option::LEVEL_ADVANCED)
1185 	    .set_default("0xF")         //begin with 0x for the string
1186 	    .set_description("")
1187 	    .add_see_also("ms_async_op_threads"),
1188 	
1189 	    Option("ms_dpdk_memory_channel", Option::TYPE_STR, Option::LEVEL_ADVANCED)
1190 	    .set_default("4")
1191 	    .set_description(""),
1192 	
1193 	    Option("ms_dpdk_hugepages", Option::TYPE_STR, Option::LEVEL_ADVANCED)
1194 	    .set_default("")
1195 	    .set_description(""),
1196 	
1197 	    Option("ms_dpdk_pmd", Option::TYPE_STR, Option::LEVEL_ADVANCED)
1198 	    .set_default("")
1199 	    .set_description(""),
1200 	
1201 	    Option("ms_dpdk_host_ipv4_addr", Option::TYPE_STR, Option::LEVEL_ADVANCED)
1202 	    .set_default("")
1203 	    .set_description(""),
1204 	
1205 	    Option("ms_dpdk_gateway_ipv4_addr", Option::TYPE_STR, Option::LEVEL_ADVANCED)
1206 	    .set_default("")
1207 	    .set_description(""),
1208 	
1209 	    Option("ms_dpdk_netmask_ipv4_addr", Option::TYPE_STR, Option::LEVEL_ADVANCED)
1210 	    .set_default("")
1211 	    .set_description(""),
1212 	
1213 	    Option("ms_dpdk_lro", Option::TYPE_BOOL, Option::LEVEL_ADVANCED)
1214 	    .set_default(true)
1215 	    .set_description(""),
1216 	
1217 	    Option("ms_dpdk_hw_flow_control", Option::TYPE_BOOL, Option::LEVEL_ADVANCED)
1218 	    .set_default(true)
1219 	    .set_description(""),
1220 	
1221 	    Option("ms_dpdk_hw_queue_weight", Option::TYPE_FLOAT, Option::LEVEL_ADVANCED)
1222 	    .set_default(1)
1223 	    .set_description(""),
1224 	
1225 	    Option("ms_dpdk_debug_allow_loopback", Option::TYPE_BOOL, Option::LEVEL_DEV)
1226 	    .set_default(false)
1227 	    .set_description(""),
1228 	
1229 	    Option("ms_dpdk_rx_buffer_count_per_core", Option::TYPE_INT, Option::LEVEL_ADVANCED)
1230 	    .set_default(8192)
1231 	    .set_description(""),
1232 	
1233 	    Option("inject_early_sigterm", Option::TYPE_BOOL, Option::LEVEL_DEV)
1234 	    .set_default(false)
1235 	    .set_description("send ourselves a SIGTERM early during startup"),
1236 	
1237 	    // MON
1238 	    Option("mon_enable_op_tracker", Option::TYPE_BOOL, Option::LEVEL_ADVANCED)
1239 	    .set_default(true)
1240 	    .add_service("mon")
1241 	    .set_description("enable/disable MON op tracking"),
1242 	
1243 	    Option("mon_op_complaint_time", Option::TYPE_SECS, Option::LEVEL_ADVANCED)
1244 	    .set_default(30)
1245 	    .add_service("mon")
1246 	    .set_description("time after which to consider a monitor operation blocked "
1247 	                     "after no updates"),
1248 	
1249 	    Option("mon_op_log_threshold", Option::TYPE_INT, Option::LEVEL_ADVANCED)
1250 	    .set_default(5)
1251 	    .add_service("mon")
1252 	    .set_description("max number of slow ops to display"),
1253 	
1254 	    Option("mon_op_history_size", Option::TYPE_UINT, Option::LEVEL_ADVANCED)
1255 	    .set_default(20)
1256 	    .add_service("mon")
1257 	    .set_description("max number of completed ops to track"),
1258 	
1259 	    Option("mon_op_history_duration", Option::TYPE_SECS, Option::LEVEL_ADVANCED)
1260 	    .set_default(600)
1261 	    .add_service("mon")
1262 	    .set_description("expiration time in seconds of historical MON OPS"),
1263 	
1264 	    Option("mon_op_history_slow_op_size", Option::TYPE_UINT, Option::LEVEL_ADVANCED)
1265 	    .set_default(20)
1266 	    .add_service("mon")
1267 	    .set_description("max number of slow historical MON OPS to keep"),
1268 	
1269 	    Option("mon_op_history_slow_op_threshold", Option::TYPE_SECS, Option::LEVEL_ADVANCED)
1270 	    .set_default(10)
1271 	    .add_service("mon")
1272 	    .set_description("duration of an op to be considered as a historical slow op"),
1273 	
1274 	    Option("mon_data", Option::TYPE_STR, Option::LEVEL_ADVANCED)
1275 	    .set_flag(Option::FLAG_NO_MON_UPDATE)
1276 	    .set_default("/var/lib/ceph/mon/$cluster-$id")
1277 	    .add_service("mon")
1278 	    .set_description("path to mon database"),
1279 	
1280 	    Option("mon_initial_members", Option::TYPE_STR, Option::LEVEL_ADVANCED)
1281 	    .set_default("")
1282 	    .add_service("mon")
1283 	    .set_flag(Option::FLAG_NO_MON_UPDATE)
1284 	    .set_flag(Option::FLAG_CLUSTER_CREATE)
1285 	    .set_description(""),
1286 	
1287 	    Option("mon_compact_on_start", Option::TYPE_BOOL, Option::LEVEL_ADVANCED)
1288 	    .set_default(false)
1289 	    .add_service("mon")
1290 	    .set_description(""),
1291 	
1292 	    Option("mon_compact_on_bootstrap", Option::TYPE_BOOL, Option::LEVEL_ADVANCED)
1293 	    .set_default(false)
1294 	    .add_service("mon")
1295 	    .set_description(""),
1296 	
1297 	    Option("mon_compact_on_trim", Option::TYPE_BOOL, Option::LEVEL_ADVANCED)
1298 	    .set_default(true)
1299 	    .add_service("mon")
1300 	    .set_description(""),
1301 	
1302 	    /* -- mon: osdmap prune (begin) -- */
1303 	    Option("mon_osdmap_full_prune_enabled", Option::TYPE_BOOL, Option::LEVEL_ADVANCED)
1304 	    .set_default(true)
1305 	    .add_service("mon")
1306 	    .set_description("enables pruning full osdmap versions when we go over a given number of maps")
1307 	    .add_see_also("mon_osdmap_full_prune_min")
1308 	    .add_see_also("mon_osdmap_full_prune_interval")
1309 	    .add_see_also("mon_osdmap_full_prune_txsize"),
1310 	
1311 	    Option("mon_osdmap_full_prune_min", Option::TYPE_UINT, Option::LEVEL_ADVANCED)
1312 	    .set_default(10000)
1313 	    .add_service("mon")
1314 	    .set_description("minimum number of versions in the store to trigger full map pruning")
1315 	    .add_see_also("mon_osdmap_full_prune_enabled")
1316 	    .add_see_also("mon_osdmap_full_prune_interval")
1317 	    .add_see_also("mon_osdmap_full_prune_txsize"),
1318 	
1319 	    Option("mon_osdmap_full_prune_interval", Option::TYPE_UINT, Option::LEVEL_ADVANCED)
1320 	    .set_default(10)
1321 	    .add_service("mon")
1322 	    .set_description("interval between maps that will not be pruned; maps in the middle will be pruned.")
1323 	    .add_see_also("mon_osdmap_full_prune_enabled")
1324 	    .add_see_also("mon_osdmap_full_prune_interval")
1325 	    .add_see_also("mon_osdmap_full_prune_txsize"),
1326 	
1327 	    Option("mon_osdmap_full_prune_txsize", Option::TYPE_UINT, Option::LEVEL_ADVANCED)
1328 	    .set_default(100)
1329 	    .add_service("mon")
1330 	    .set_description("number of maps we will prune per iteration")
1331 	    .add_see_also("mon_osdmap_full_prune_enabled")
1332 	    .add_see_also("mon_osdmap_full_prune_interval")
1333 	    .add_see_also("mon_osdmap_full_prune_txsize"),
1334 	    /* -- mon: osdmap prune (end) -- */
1335 	
1336 	    Option("mon_osd_cache_size", Option::TYPE_INT, Option::LEVEL_ADVANCED)
1337 	    .set_default(500)
1338 	    .add_service("mon")
1339 	    .set_description("maximum number of OSDMaps to cache in memory"),
1340 	
1341 	    Option("mon_osd_cache_size_min", Option::TYPE_SIZE, Option::LEVEL_ADVANCED)
1342 	    .set_default(128_M)
1343 	    .add_service("mon")
1344 	    .set_description("The minimum amount of bytes to be kept mapped in memory for osd monitor caches."),
1345 	
1346 	    Option("mon_memory_target", Option::TYPE_SIZE, Option::LEVEL_BASIC)
1347 	    .set_default(2_G)
1348 	    .set_flag(Option::FLAG_RUNTIME)
1349 	    .add_service("mon")
1350 	    .set_description("The amount of bytes pertaining to osd monitor caches and kv cache to be kept mapped in memory with cache auto-tuning enabled"),
1351 	
1352 	    Option("mon_memory_autotune", Option::TYPE_BOOL, Option::LEVEL_BASIC)
1353 	    .set_default(true)
1354 	    .set_flag(Option::FLAG_RUNTIME)
1355 	    .add_service("mon")
1356 	    .set_description("Autotune the cache memory being used for osd monitors and kv database"),
1357 	
1358 	    Option("mon_cpu_threads", Option::TYPE_INT, Option::LEVEL_ADVANCED)
1359 	    .set_default(4)
1360 	    .add_service("mon")
1361 	    .set_description("worker threads for CPU intensive background work"),
1362 	
1363 	    Option("mon_osd_mapping_pgs_per_chunk", Option::TYPE_INT, Option::LEVEL_DEV)
1364 	    .set_default(4096)
1365 	    .add_service("mon")
1366 	    .set_description("granularity of PG placement calculation background work"),
1367 	
1368 	    Option("mon_clean_pg_upmaps_per_chunk", Option::TYPE_UINT, Option::LEVEL_DEV)
1369 	    .set_default(256)
1370 	    .add_service("mon")
1371 	    .set_description("granularity of PG upmap validation background work"),
1372 	
1373 	    Option("mon_osd_max_creating_pgs", Option::TYPE_INT, Option::LEVEL_ADVANCED)
1374 	    .set_default(1024)
1375 	    .add_service("mon")
1376 	    .set_description("maximum number of PGs the mon will create at once"),
1377 	
1378 	    Option("mon_osd_max_initial_pgs", Option::TYPE_INT, Option::LEVEL_ADVANCED)
1379 	    .set_default(1024)
1380 	    .add_service("mon")
1381 	    .set_description("maximum number of PGs a pool will created with")
1382 	    .set_long_description("If the user specifies more PGs than this, the cluster will subsequently split PGs after the pool is created in order to reach the target."),
1383 	
1384 	    Option("mon_tick_interval", Option::TYPE_INT, Option::LEVEL_ADVANCED)
1385 	    .set_default(5)
1386 	    .add_service("mon")
1387 	    .set_description("interval for internal mon background checks"),
1388 	
1389 	    Option("mon_session_timeout", Option::TYPE_INT, Option::LEVEL_ADVANCED)
1390 	    .set_default(300)
1391 	    .add_service("mon")
1392 	    .set_description("close inactive mon client connections after this many seconds"),
1393 	
1394 	    Option("mon_subscribe_interval", Option::TYPE_FLOAT, Option::LEVEL_DEV)
1395 	    .set_default(1_day)
1396 	    .add_service("mon")
1397 	    .set_description("subscribe interval for pre-jewel clients"),
1398 	
1399 	    Option("mon_delta_reset_interval", Option::TYPE_FLOAT, Option::LEVEL_ADVANCED)
1400 	    .set_default(10)
1401 	    .add_service("mon")
1402 	    .add_service("mon")
1403 	    .set_description("window duration for rate calculations in 'ceph status'"),
1404 	
1405 	    Option("mon_osd_laggy_halflife", Option::TYPE_INT, Option::LEVEL_ADVANCED)
1406 	    .set_default(1_hr)
1407 	    .add_service("mon")
1408 	    .set_description("halflife of OSD 'lagginess' factor"),
1409 	
1410 	    Option("mon_osd_laggy_weight", Option::TYPE_FLOAT, Option::LEVEL_ADVANCED)
1411 	    .set_default(.3)
1412 	    .set_min_max(0.0, 1.0)
1413 	    .add_service("mon")
1414 	    .set_description("how heavily to weight OSD marking itself back up in overall laggy_probability")
1415 	    .set_long_description("1.0 means that an OSD marking itself back up (because it was marked down but not actually dead) means a 100% laggy_probability; 0.0 effectively disables tracking of laggy_probability."),
1416 	
1417 	    Option("mon_osd_laggy_max_interval", Option::TYPE_INT, Option::LEVEL_ADVANCED)
1418 	    .set_default(300)
1419 	    .add_service("mon")
1420 	    .set_description("cap value for period for OSD to be marked for laggy_interval calculation"),
1421 	
1422 	    Option("mon_osd_adjust_heartbeat_grace", Option::TYPE_BOOL, Option::LEVEL_ADVANCED)
1423 	    .set_default(true)
1424 	    .add_service("mon")
1425 	    .set_description("increase OSD heartbeat grace if peers appear to be laggy")
1426 	    .set_long_description("If an OSD is marked down but then marks itself back up, it implies it wasn't actually down but was unable to respond to heartbeats.  If this option is true, we can use the laggy_probability and laggy_interval values calculated to model this situation to increase the heartbeat grace period for this OSD so that it isn't marked down again.  laggy_probability is an estimated probability that the given OSD is down because it is laggy (not actually down), and laggy_interval is an estiate on how long it stays down when it is laggy.")
1427 	    .add_see_also("mon_osd_laggy_halflife")
1428 	    .add_see_also("mon_osd_laggy_weight")
1429 	    .add_see_also("mon_osd_laggy_max_interval"),
1430 	
1431 	    Option("mon_osd_adjust_down_out_interval", Option::TYPE_BOOL, Option::LEVEL_ADVANCED)
1432 	    .set_default(true)
1433 	    .add_service("mon")
1434 	    .set_description("increase the mon_osd_down_out_interval if an OSD appears to be laggy")
1435 	    .add_see_also("mon_osd_adjust_heartbeat_grace"),
1436 	
1437 	    Option("mon_osd_auto_mark_in", Option::TYPE_BOOL, Option::LEVEL_ADVANCED)
1438 	    .set_default(false)
1439 	    .add_service("mon")
1440 	    .set_description("mark any OSD that comes up 'in'"),
1441 	
1442 	    Option("mon_osd_auto_mark_auto_out_in", Option::TYPE_BOOL, Option::LEVEL_ADVANCED)
1443 	    .set_default(true)
1444 	    .add_service("mon")
1445 	    .set_description("mark any OSD that comes up that was automatically marked 'out' back 'in'")
1446 	    .add_see_also("mon_osd_down_out_interval"),
1447 	
1448 	    Option("mon_osd_auto_mark_new_in", Option::TYPE_BOOL, Option::LEVEL_ADVANCED)
1449 	    .set_default(true)
1450 	    .add_service("mon")
1451 	    .set_description("mark any new OSD that comes up 'in'"),
1452 	
1453 	    Option("mon_osd_destroyed_out_interval", Option::TYPE_INT, Option::LEVEL_ADVANCED)
1454 	    .set_default(600)
1455 	    .add_service("mon")
1456 	    .set_description("mark any OSD 'out' that has been 'destroy'ed for this long (seconds)"),
1457 	
1458 	    Option("mon_osd_down_out_interval", Option::TYPE_INT, Option::LEVEL_ADVANCED)
1459 	    .set_default(600)
1460 	    .add_service("mon")
1461 	    .set_description("mark any OSD 'out' that has been 'down' for this long (seconds)"),
1462 	
1463 	    Option("mon_osd_down_out_subtree_limit", Option::TYPE_STR, Option::LEVEL_ADVANCED)
1464 	    .set_default("rack")
1465 	    .set_flag(Option::FLAG_RUNTIME)
1466 	    .add_service("mon")
1467 	    .set_description("do not automatically mark OSDs 'out' if an entire subtree of this size is down")
1468 	    .add_see_also("mon_osd_down_out_interval"),
1469 	
1470 	    Option("mon_osd_min_up_ratio", Option::TYPE_FLOAT, Option::LEVEL_ADVANCED)
1471 	    .set_default(.3)
1472 	    .add_service("mon")
1473 	    .set_description("do not automatically mark OSDs 'out' if fewer than this many OSDs are 'up'")
1474 	    .add_see_also("mon_osd_down_out_interval"),
1475 	
1476 	    Option("mon_osd_min_in_ratio", Option::TYPE_FLOAT, Option::LEVEL_ADVANCED)
1477 	    .set_default(.75)
1478 	    .add_service("mon")
1479 	    .set_description("do not automatically mark OSDs 'out' if fewer than this many OSDs are 'in'")
1480 	    .add_see_also("mon_osd_down_out_interval"),
1481 	
1482 	    Option("mon_osd_warn_op_age", Option::TYPE_FLOAT, Option::LEVEL_ADVANCED)
1483 	    .set_default(32)
1484 	    .add_service("mgr")
1485 	    .set_description("issue REQUEST_SLOW health warning if OSD ops are slower than this age (seconds)"),
1486 	
1487 	    Option("mon_osd_err_op_age_ratio", Option::TYPE_FLOAT, Option::LEVEL_ADVANCED)
1488 	    .set_default(128)
1489 	    .add_service("mgr")
1490 	    .set_description("issue REQUEST_STUCK health error if OSD ops are slower than is age (seconds)"),
1491 	
1492 	    Option("mon_osd_prime_pg_temp", Option::TYPE_BOOL, Option::LEVEL_DEV)
1493 	    .set_default(true)
1494 	    .add_service("mon")
1495 	    .set_description("minimize peering work by priming pg_temp values after a map change"),
1496 	
1497 	    Option("mon_osd_prime_pg_temp_max_time", Option::TYPE_FLOAT, Option::LEVEL_DEV)
1498 	    .set_default(.5)
1499 	    .add_service("mon")
1500 	    .set_description("maximum time to spend precalculating PG mappings on map change (seconds)"),
1501 	
1502 	    Option("mon_osd_prime_pg_temp_max_estimate", Option::TYPE_FLOAT, Option::LEVEL_ADVANCED)
1503 	    .set_default(.25)
1504 	    .add_service("mon")
1505 	    .set_description("calculate all PG mappings if estimated fraction of PGs that change is above this amount"),
1506 	
1507 	    Option("mon_stat_smooth_intervals", Option::TYPE_UINT, Option::LEVEL_ADVANCED)
1508 	    .set_default(6)
1509 	    .set_min(1)
1510 	    .add_service("mgr")
1511 	    .set_description("number of PGMaps stats over which we calc the average read/write throughput of the whole cluster"),
1512 	
1513 	    Option("mon_election_timeout", Option::TYPE_FLOAT, Option::LEVEL_ADVANCED)
1514 	    .set_default(5)
1515 	    .add_service("mon")
1516 	    .set_description("maximum time for a mon election (seconds)"),
1517 	
1518 	    Option("mon_lease", Option::TYPE_FLOAT, Option::LEVEL_ADVANCED)
1519 	    .set_default(5)
1520 	    .add_service("mon")
1521 	    .set_description("lease interval between quorum monitors (seconds)")
1522 	    .set_long_description("This setting controls how sensitive your mon quorum is to intermittent network issues or other failures."),
1523 	
1524 	    Option("mon_lease_renew_interval_factor", Option::TYPE_FLOAT, Option::LEVEL_ADVANCED)
1525 	    .set_default(.6)
1526 	    .set_min_max((double)0.0, (double).9999999)
1527 	    .add_service("mon")
1528 	    .set_description("multiple of mon_lease for the lease renewal interval")
1529 	    .set_long_description("Leases must be renewed before they time out.  A smaller value means frequent renewals, while a value close to 1 makes a lease expiration more likely.")
1530 	    .add_see_also("mon_lease"),
1531 	
1532 	    Option("mon_lease_ack_timeout_factor", Option::TYPE_FLOAT, Option::LEVEL_ADVANCED)
1533 	    .set_default(2.0)
1534 	    .set_min_max(1.0001, 100.0)
1535 	    .add_service("mon")
1536 	    .set_description("multiple of mon_lease for the lease ack interval before calling new election")
1537 	    .add_see_also("mon_lease"),
1538 	
1539 	    Option("mon_accept_timeout_factor", Option::TYPE_FLOAT, Option::LEVEL_ADVANCED)
1540 	    .set_default(2.0)
1541 	    .add_service("mon")
1542 	    .set_description("multiple of mon_lease for follower mons to accept proposed state changes before calling a new election")
1543 	    .add_see_also("mon_lease"),
1544 	
1545 	    Option("mon_clock_drift_allowed", Option::TYPE_FLOAT, Option::LEVEL_ADVANCED)
1546 	    .set_default(.050)
1547 	    .add_service("mon")
1548 	    .set_description("allowed clock drift (in seconds) between mons before issuing a health warning"),
1549 	
1550 	    Option("mon_clock_drift_warn_backoff", Option::TYPE_FLOAT, Option::LEVEL_ADVANCED)
1551 	    .set_default(5)
1552 	    .add_service("mon")
1553 	    .set_description("exponential backoff factor for logging clock drift warnings in the cluster log"),
1554 	
1555 	    Option("mon_timecheck_interval", Option::TYPE_FLOAT, Option::LEVEL_ADVANCED)
1556 	    .set_default(300.0)
1557 	    .add_service("mon")
1558 	    .set_description("frequency of clock synchronization checks between monitors (seconds)"),
1559 	
1560 	    Option("mon_timecheck_skew_interval", Option::TYPE_FLOAT, Option::LEVEL_ADVANCED)
1561 	    .set_default(30.0)
1562 	    .add_service("mon")
1563 	    .set_description("frequency of clock synchronization (re)checks between monitors while clocks are believed to be skewed (seconds)")
1564 	    .add_see_also("mon_timecheck_interval"),
1565 	
1566 	    Option("mon_pg_stuck_threshold", Option::TYPE_INT, Option::LEVEL_ADVANCED)
1567 	    .set_default(60)
1568 	    .set_description("number of seconds after which pgs can be considered stuck inactive, unclean, etc")
1569 	    .set_long_description("see doc/control.rst under dump_stuck for more info")
1570 	    .add_service("mgr"),
1571 	
1572 	    Option("mon_pg_warn_min_per_osd", Option::TYPE_UINT, Option::LEVEL_ADVANCED)
1573 	    .set_default(0)
1574 	    .add_service("mgr")
1575 	    .set_description("minimal number PGs per (in) osd before we warn the admin"),
1576 	
1577 	    Option("mon_max_pg_per_osd", Option::TYPE_UINT, Option::LEVEL_ADVANCED)
1578 	    .set_min(1)
1579 	    .set_default(250)
1580 	    .add_service("mgr")
1581 	    .set_description("Max number of PGs per OSD the cluster will allow")
1582 	    .set_long_description("If the number of PGs per OSD exceeds this, a "
1583 	        "health warning will be visible in `ceph status`.  This is also used "
1584 	        "in automated PG management, as the threshold at which some pools' "
1585 	        "pg_num may be shrunk in order to enable increasing the pg_num of "
1586 	        "others."),
1587 	
1588 	    Option("mon_target_pg_per_osd", Option::TYPE_UINT, Option::LEVEL_ADVANCED)
1589 	    .set_min(1)
1590 	    .set_default(100)
1591 	    .set_description("Automated PG management creates this many PGs per OSD")
1592 	    .set_long_description("When creating pools, the automated PG management "
1593 	        "logic will attempt to reach this target.  In some circumstances, it "
1594 	        "may exceed this target, up to the ``mon_max_pg_per_osd`` limit. "
1595 	        "Conversely, a lower number of PGs per OSD may be created if the "
1596 	        "cluster is not yet fully utilised"),
1597 	
1598 	    Option("mon_pg_warn_max_object_skew", Option::TYPE_FLOAT, Option::LEVEL_ADVANCED)
1599 	    .set_default(10.0)
1600 	    .set_description("max skew few average in objects per pg")
1601 	    .add_service("mgr"),
1602 	
1603 	    Option("mon_pg_warn_min_objects", Option::TYPE_INT, Option::LEVEL_ADVANCED)
1604 	    .set_default(10000)
1605 	    .set_description("do not warn below this object #")
1606 	    .add_service("mgr"),
1607 	
1608 	    Option("mon_pg_warn_min_pool_objects", Option::TYPE_INT, Option::LEVEL_ADVANCED)
1609 	    .set_default(1000)
1610 	    .set_description("do not warn on pools below this object #")
1611 	    .add_service("mgr"),
1612 	
1613 	    Option("mon_pg_check_down_all_threshold", Option::TYPE_FLOAT, Option::LEVEL_ADVANCED)
1614 	    .set_default(.5)
1615 	    .set_description("threshold of down osds after which we check all pgs")
1616 	    .add_service("mgr"),
1617 	
1618 	    Option("mon_cache_target_full_warn_ratio", Option::TYPE_FLOAT, Option::LEVEL_ADVANCED)
1619 	    .set_default(.66)
1620 	    .add_service("mgr")
1621 	    .set_flag(Option::FLAG_NO_MON_UPDATE)
1622 	    .set_flag(Option::FLAG_CLUSTER_CREATE)
1623 	    .set_description("issue CACHE_POOL_NEAR_FULL health warning when cache pool utilization exceeds this ratio of usable space"),
1624 	
1625 	    Option("mon_osd_full_ratio", Option::TYPE_FLOAT, Option::LEVEL_ADVANCED)
1626 	    .set_default(.95)
1627 	    .set_flag(Option::FLAG_NO_MON_UPDATE)
1628 	    .set_flag(Option::FLAG_CLUSTER_CREATE)
1629 	    .set_description("full ratio of OSDs to be set during initial creation of the cluster"),
1630 	
1631 	    Option("mon_osd_backfillfull_ratio", Option::TYPE_FLOAT, Option::LEVEL_ADVANCED)
1632 	    .set_default(.90)
1633 	    .set_flag(Option::FLAG_NO_MON_UPDATE)
1634 	    .set_flag(Option::FLAG_CLUSTER_CREATE)
1635 	    .set_description(""),
1636 	
1637 	    Option("mon_osd_nearfull_ratio", Option::TYPE_FLOAT, Option::LEVEL_ADVANCED)
1638 	    .set_default(.85)
1639 	    .set_flag(Option::FLAG_NO_MON_UPDATE)
1640 	    .set_flag(Option::FLAG_CLUSTER_CREATE)
1641 	    .set_description("nearfull ratio for OSDs to be set during initial creation of cluster"),
1642 	
1643 	    Option("mon_osd_initial_require_min_compat_client", Option::TYPE_STR, Option::LEVEL_ADVANCED)
1644 	    .set_default("jewel")
1645 	    .set_flag(Option::FLAG_NO_MON_UPDATE)
1646 	    .set_flag(Option::FLAG_CLUSTER_CREATE)
1647 	    .set_description(""),
1648 	
1649 	    Option("mon_allow_pool_delete", Option::TYPE_BOOL, Option::LEVEL_ADVANCED)
1650 	    .set_default(false)
1651 	    .add_service("mon")
1652 	    .set_description("allow pool deletions"),
1653 	
1654 	    Option("mon_fake_pool_delete", Option::TYPE_BOOL, Option::LEVEL_ADVANCED)
1655 	    .set_default(false)
1656 	    .add_service("mon")
1657 	    .set_description("fake pool deletions by renaming the rados pool"),
1658 	
1659 	    Option("mon_globalid_prealloc", Option::TYPE_UINT, Option::LEVEL_ADVANCED)
1660 	    .set_default(10000)
1661 	    .add_service("mon")
1662 	    .set_description("number of globalid values to preallocate")
1663 	    .set_long_description("This setting caps how many new clients can authenticate with the cluster before the monitors have to perform a write to preallocate more.  Large values burn through the 64-bit ID space more quickly."),
1664 	
1665 	    Option("mon_osd_report_timeout", Option::TYPE_INT, Option::LEVEL_ADVANCED)
1666 	    .set_default(900)
1667 	    .add_service("mon")
1668 	    .set_description("time before OSDs who do not report to the mons are marked down (seconds)"),
1669 	
1670 	    Option("mon_warn_on_msgr2_not_enabled", Option::TYPE_BOOL, Option::LEVEL_ADVANCED)
1671 	    .set_default(true)
1672 	    .add_service("mon")
1673 	    .set_description("issue MON_MSGR2_NOT_ENABLED health warning if monitors are all running Nautilus but not all binding to a msgr2 port")
1674 	    .add_see_also("ms_bind_msgr2"),
1675 	
1676 	    Option("mon_warn_on_legacy_crush_tunables", Option::TYPE_BOOL, Option::LEVEL_ADVANCED)
1677 	    .set_default(true)
1678 	    .add_service("mgr")
1679 	    .set_description("issue OLD_CRUSH_TUNABLES health warning if CRUSH tunables are older than mon_crush_min_required_version")
1680 	    .add_see_also("mon_crush_min_required_version"),
1681 	
1682 	    Option("mon_crush_min_required_version", Option::TYPE_STR, Option::LEVEL_ADVANCED)
1683 	    .set_default("hammer")
1684 	    .add_service("mgr")
1685 	    .set_description("minimum ceph release to use for mon_warn_on_legacy_crush_tunables")
1686 	    .add_see_also("mon_warn_on_legacy_crush_tunables"),
1687 	
1688 	    Option("mon_warn_on_crush_straw_calc_version_zero", Option::TYPE_BOOL, Option::LEVEL_ADVANCED)
1689 	    .set_default(true)
1690 	    .add_service("mgr")
1691 	    .set_description("issue OLD_CRUSH_STRAW_CALC_VERSION health warning if the CRUSH map's straw_calc_version is zero"),
1692 	
1693 	    Option("mon_warn_on_osd_down_out_interval_zero", Option::TYPE_BOOL, Option::LEVEL_ADVANCED)
1694 	    .set_default(true)
1695 	    .add_service("mgr")
1696 	    .set_description("issue OSD_NO_DOWN_OUT_INTERVAL health warning if mon_osd_down_out_interval is zero")
1697 	    .set_long_description("Having mon_osd_down_out_interval set to 0 means that down OSDs are not marked out automatically and the cluster does not heal itself without administrator intervention.")
1698 	    .add_see_also("mon_osd_down_out_interval"),
1699 	
1700 	    Option("mon_warn_on_cache_pools_without_hit_sets", Option::TYPE_BOOL, Option::LEVEL_ADVANCED)
1701 	    .set_default(true)
1702 	    .add_service("mgr")
1703 	    .set_description("issue CACHE_POOL_NO_HIT_SET health warning for cache pools that do not have hit sets configured"),
1704 	
1705 	    Option("mon_warn_on_pool_no_app", Option::TYPE_BOOL, Option::LEVEL_DEV)
1706 	    .set_default(true)
1707 	    .add_service("mgr")
1708 	    .set_description("issue POOL_APP_NOT_ENABLED health warning if pool has not application enabled"),
1709 	
1710 	    Option("mon_warn_on_pool_pg_num_not_power_of_two", Option::TYPE_BOOL, Option::LEVEL_DEV)
1711 	    .set_default(true)
1712 	    .add_service("mon")
1713 	    .set_description("issue POOL_PG_NUM_NOT_POWER_OF_TWO warning if pool has a non-power-of-two pg_num value"),
1714 	
1715 	    Option("mon_warn_on_misplaced", Option::TYPE_BOOL, Option::LEVEL_ADVANCED)
1716 	    .set_default(false)
1717 	    .add_service("mgr")
1718 	    .set_description("Issue a health warning if there are misplaced objects"),
1719 	
1720 	    Option("mon_warn_on_too_few_osds", Option::TYPE_BOOL, Option::LEVEL_ADVANCED)
1721 	    .set_default(true)
1722 	    .add_service("mgr")
1723 	    .set_description("Issue a health warning if there are fewer OSDs than osd_pool_default_size"),
1724 	
1725 	    Option("mon_warn_on_slow_ping_time", Option::TYPE_FLOAT, Option::LEVEL_ADVANCED)
1726 	    .set_default(0)
1727 	    .add_service("mgr")
1728 	    .set_description("Override mon_warn_on_slow_ping_ratio with specified threshold in milliseconds")
1729 	    .add_see_also("mon_warn_on_slow_ping_ratio"),
1730 	
1731 	    Option("mon_warn_on_slow_ping_ratio", Option::TYPE_FLOAT, Option::LEVEL_ADVANCED)
1732 	    .set_default(.05)
1733 	    .add_service("mgr")
1734 	    .set_description("Issue a health warning if heartbeat ping longer than percentage of osd_heartbeat_grace")
1735 	    .add_see_also("osd_heartbeat_grace")
1736 	    .add_see_also("mon_warn_on_slow_ping_time"),
1737 	
1738 	    Option("mon_max_snap_prune_per_epoch", Option::TYPE_UINT, Option::LEVEL_ADVANCED)
1739 	    .set_default(100)
1740 	    .add_service("mon")
1741 	    .set_description("max number of pruned snaps we will process in a single OSDMap epoch"),
1742 	
1743 	    Option("mon_min_osdmap_epochs", Option::TYPE_INT, Option::LEVEL_ADVANCED)
1744 	    .set_default(500)
1745 	    .add_service("mon")
1746 	    .set_description("min number of OSDMaps to store"),
1747 	
1748 	    Option("mon_max_log_epochs", Option::TYPE_INT, Option::LEVEL_ADVANCED)
1749 	    .set_default(500)
1750 	    .add_service("mon")
1751 	    .set_description("max number of past cluster log epochs to store"),
1752 	
1753 	    Option("mon_max_mdsmap_epochs", Option::TYPE_INT, Option::LEVEL_ADVANCED)
1754 	    .set_default(500)
1755 	    .add_service("mon")
1756 	    .set_description("max number of FSMaps/MDSMaps to store"),
1757 	
1758 	    Option("mon_max_mgrmap_epochs", Option::TYPE_INT, Option::LEVEL_ADVANCED)
1759 	    .set_default(500)
1760 	    .add_service("mon")
1761 	    .set_description("max number of MgrMaps to store"),
1762 	
1763 	    Option("mon_max_osd", Option::TYPE_INT, Option::LEVEL_ADVANCED)
1764 	    .set_default(10000)
1765 	    .add_service("mon")
1766 	    .set_description("max number of OSDs in a cluster"),
1767 	
1768 	    Option("mon_probe_timeout", Option::TYPE_FLOAT, Option::LEVEL_ADVANCED)
1769 	    .set_default(2.0)
1770 	    .add_service("mon")
1771 	    .set_description("timeout for querying other mons during bootstrap pre-election phase (seconds)"),
1772 	
1773 	    Option("mon_client_bytes", Option::TYPE_SIZE, Option::LEVEL_ADVANCED)
1774 	    .set_default(100ul << 20)
1775 	    .add_service("mon")
1776 	    .set_description("max bytes of outstanding client messages mon will read off the network"),
1777 	
1778 	    Option("mon_daemon_bytes", Option::TYPE_SIZE, Option::LEVEL_ADVANCED)
1779 	    .set_default(400ul << 20)
1780 	    .add_service("mon")
1781 	    .set_description("max bytes of outstanding mon messages mon will read off the network"),
1782 	
1783 	    Option("mon_mgr_proxy_client_bytes_ratio", Option::TYPE_FLOAT, Option::LEVEL_DEV)
1784 	    .set_default(.3)
1785 	    .add_service("mon")
1786 	    .set_description("ratio of mon_client_bytes that can be consumed by "
1787 	                     "proxied mgr commands before we error out to client"),
1788 	
1789 	    Option("mon_log_max_summary", Option::TYPE_UINT, Option::LEVEL_ADVANCED)
1790 	    .set_default(50)
1791 	    .add_service("mon")
1792 	    .set_description("number of recent cluster log messages to retain"),
1793 	
1794 	    Option("mon_max_log_entries_per_event", Option::TYPE_INT, Option::LEVEL_ADVANCED)
1795 	    .set_default(4096)
1796 	    .add_service("mon")
1797 	    .set_description("max cluster log entries per paxos event"),
1798 	
1799 	    Option("mon_reweight_min_pgs_per_osd", Option::TYPE_UINT, Option::LEVEL_ADVANCED)
1800 	    .set_default(10)
1801 	    .add_service("mgr")
1802 	    .set_description(""),
1803 	
1804 	    Option("mon_reweight_min_bytes_per_osd", Option::TYPE_SIZE, Option::LEVEL_ADVANCED)
1805 	    .set_default(100_M)
1806 	    .add_service("mgr")
1807 	    .set_description(""),
1808 	
1809 	    Option("mon_reweight_max_osds", Option::TYPE_INT, Option::LEVEL_ADVANCED)
1810 	    .set_default(4)
1811 	    .add_service("mgr")
1812 	    .set_description(""),
1813 	
1814 	    Option("mon_reweight_max_change", Option::TYPE_FLOAT, Option::LEVEL_ADVANCED)
1815 	    .set_default(0.05)
1816 	    .add_service("mgr")
1817 	    .set_description(""),
1818 	
1819 	    Option("mon_health_to_clog", Option::TYPE_BOOL, Option::LEVEL_ADVANCED)
1820 	    .set_default(true)
1821 	    .add_service("mon")
1822 	    .set_description("log monitor health to cluster log"),
1823 	
1824 	    Option("mon_health_to_clog_interval", Option::TYPE_INT, Option::LEVEL_ADVANCED)
1825 	    .set_default(1_hr)
1826 	    .add_service("mon")
1827 	    .set_description("frequency to log monitor health to cluster log")
1828 	    .add_see_also("mon_health_to_clog"),
1829 	
1830 	    Option("mon_health_to_clog_tick_interval", Option::TYPE_FLOAT, Option::LEVEL_DEV)
1831 	    .set_default(60.0)
1832 	    .add_service("mon")
1833 	    .set_description(""),
1834 	
1835 	    Option("mon_health_max_detail", Option::TYPE_UINT, Option::LEVEL_ADVANCED)
1836 	    .set_default(50)
1837 	    .add_service("mon")
1838 	    .set_description("max detailed pgs to report in health detail"),
1839 	
1840 	    Option("mon_health_log_update_period", Option::TYPE_INT, Option::LEVEL_DEV)
1841 	    .set_default(5)
1842 	    .add_service("mon")
1843 	    .set_description("minimum time in seconds between log messages about "
1844 	                     "each health check")
1845 	    .set_min(0),
1846 	
1847 	    Option("mon_data_avail_crit", Option::TYPE_INT, Option::LEVEL_ADVANCED)
1848 	    .set_default(5)
1849 	    .add_service("mon")
1850 	    .set_description("issue MON_DISK_CRIT health error when mon available space below this percentage"),
1851 	
1852 	    Option("mon_data_avail_warn", Option::TYPE_INT, Option::LEVEL_ADVANCED)
1853 	    .set_default(30)
1854 	    .add_service("mon")
1855 	    .set_description("issue MON_DISK_LOW health warning when mon available space below this percentage"),
1856 	
1857 	    Option("mon_data_size_warn", Option::TYPE_SIZE, Option::LEVEL_ADVANCED)
1858 	    .set_default(15_G)
1859 	    .add_service("mon")
1860 	    .set_description("issue MON_DISK_BIG health warning when mon database is above this size"),
1861 	
1862 	    Option("mon_warn_pg_not_scrubbed_ratio", Option::TYPE_FLOAT, Option::LEVEL_ADVANCED)
1863 	    .set_default(0.5)
1864 	    .set_min(0)
1865 	    .set_description("Percentage of the scrub max interval past the scrub max interval to warn")
1866 	    .set_long_description("")
1867 	    .add_see_also("osd_scrub_max_interval"),
1868 	
1869 	    Option("mon_warn_pg_not_deep_scrubbed_ratio", Option::TYPE_FLOAT, Option::LEVEL_ADVANCED)
1870 	    .set_default(0.75)
1871 	    .set_min(0)
1872 	    .set_description("Percentage of the deep scrub interval past the deep scrub interval to warn")
1873 	    .set_long_description("")
1874 	    .add_see_also("osd_deep_scrub_interval"),
1875 	
1876 	    Option("mon_scrub_interval", Option::TYPE_INT, Option::LEVEL_ADVANCED)
1877 	    .set_default(1_day)
1878 	    .add_service("mon")
1879 	    .set_description("frequency for scrubbing mon database"),
1880 	
1881 	    Option("mon_scrub_timeout", Option::TYPE_INT, Option::LEVEL_ADVANCED)
1882 	    .set_default(5_min)
1883 	    .add_service("mon")
1884 	    .set_description("timeout to restart scrub of mon quorum participant does not respond for the latest chunk"),
1885 	
1886 	    Option("mon_scrub_max_keys", Option::TYPE_INT, Option::LEVEL_ADVANCED)
1887 	    .set_default(100)
1888 	    .add_service("mon")
1889 	    .set_description("max keys per on scrub chunk/step"),
1890 	
1891 	    Option("mon_scrub_inject_crc_mismatch", Option::TYPE_FLOAT, Option::LEVEL_DEV)
1892 	    .set_default(0.0)
1893 	    .add_service("mon")
1894 	    .set_description("probability for injecting crc mismatches into mon scrub"),
1895 	
1896 	    Option("mon_scrub_inject_missing_keys", Option::TYPE_FLOAT, Option::LEVEL_DEV)
1897 	    .set_default(0.0)
1898 	    .add_service("mon")
1899 	    .set_description("probability for injecting missing keys into mon scrub"),
1900 	
1901 	    Option("mon_config_key_max_entry_size", Option::TYPE_SIZE, Option::LEVEL_ADVANCED)
1902 	    .set_default(64_K)
1903 	    .add_service("mon")
1904 	    .set_description("Defines the number of bytes allowed to be held in a "
1905 			     "single config-key entry"),
1906 	
1907 	    Option("mon_sync_timeout", Option::TYPE_FLOAT, Option::LEVEL_ADVANCED)
1908 	    .set_default(60.0)
1909 	    .add_service("mon")
1910 	    .set_description("timeout before canceling sync if syncing mon does not respond"),
1911 	
1912 	    Option("mon_sync_max_payload_size", Option::TYPE_SIZE, Option::LEVEL_ADVANCED)
1913 	    .set_default(1_M)
1914 	    .add_service("mon")
1915 	    .set_description("target max message payload for mon sync"),
1916 	
1917 	    Option("mon_sync_debug", Option::TYPE_BOOL, Option::LEVEL_DEV)
1918 	    .set_default(false)
1919 	    .add_service("mon")
1920 	    .set_description("enable extra debugging during mon sync"),
1921 	
1922 	    Option("mon_inject_sync_get_chunk_delay", Option::TYPE_FLOAT, Option::LEVEL_DEV)
1923 	    .set_default(0)
1924 	    .add_service("mon")
1925 	    .set_description("inject delay during sync (seconds)"),
1926 	
1927 	    Option("mon_osd_min_down_reporters", Option::TYPE_UINT, Option::LEVEL_ADVANCED)
1928 	    .set_default(2)
1929 	    .add_service("mon")
1930 	    .set_description("number of OSDs from different subtrees who need to report a down OSD for it to count")
1931 	    .add_see_also("mon_osd_reporter_subtree_level"),
1932 	
1933 	    Option("mon_osd_reporter_subtree_level", Option::TYPE_STR, Option::LEVEL_ADVANCED)
1934 	    .set_default("host")
1935 	    .add_service("mon")
1936 	    .set_flag(Option::FLAG_RUNTIME)
1937 	    .set_description("in which level of parent bucket the reporters are counted"),
1938 	
1939 	    Option("mon_osd_snap_trim_queue_warn_on", Option::TYPE_INT, Option::LEVEL_ADVANCED)
1940 	    .set_default(32768)
1941 	    .add_service("mon")
1942 	    .set_description("Warn when snap trim queue is that large (or larger).")
1943 	    .set_long_description("Warn when snap trim queue length for at least one PG crosses this value, as this is indicator of snap trimmer not keeping up, wasting disk space"),
1944 	
1945 	    Option("mon_osd_force_trim_to", Option::TYPE_INT, Option::LEVEL_DEV)
1946 	    .set_default(0)
1947 	    .add_service("mon")
1948 	    .set_description("force mons to trim osdmaps through this epoch"),
1949 	
1950 	    Option("mon_mds_force_trim_to", Option::TYPE_INT, Option::LEVEL_DEV)
1951 	    .set_default(0)
1952 	    .add_service("mon")
1953 	    .set_description("force mons to trim mdsmaps/fsmaps through this epoch"),
1954 	
1955 	    Option("mon_mds_skip_sanity", Option::TYPE_BOOL, Option::LEVEL_ADVANCED)
1956 	    .set_default(false)
1957 	    .add_service("mon")
1958 	    .set_description("skip sanity checks on fsmap/mdsmap"),
1959 	
1960 	    Option("mon_debug_extra_checks", Option::TYPE_BOOL, Option::LEVEL_DEV)
1961 	    .set_default(false)
1962 	    .add_service("mon")
1963 	    .set_description("Enable some additional monitor checks")
1964 	    .set_long_description(
1965 	        "Enable some additional monitor checks that would be too expensive "
1966 	        "to run on production systems, or would only be relevant while "
1967 	        "testing or debugging."),
1968 	
1969 	    Option("mon_debug_block_osdmap_trim", Option::TYPE_BOOL, Option::LEVEL_DEV)
1970 	    .set_default(false)
1971 	    .add_service("mon")
1972 	    .set_description("Block OSDMap trimming while the option is enabled.")
1973 	    .set_long_description(
1974 	        "Blocking OSDMap trimming may be quite helpful to easily reproduce "
1975 	        "states in which the monitor keeps (hundreds of) thousands of "
1976 	        "osdmaps."),
1977 	
1978 	    Option("mon_debug_deprecated_as_obsolete", Option::TYPE_BOOL, Option::LEVEL_DEV)
1979 	    .set_default(false)
1980 	    .add_service("mon")
1981 	    .set_description("treat deprecated mon commands as obsolete"),
1982 	
1983 	    Option("mon_debug_dump_transactions", Option::TYPE_BOOL, Option::LEVEL_DEV)
1984 	    .set_default(false)
1985 	    .add_service("mon")
1986 	    .set_description("dump paxos transactions to log")
1987 	    .add_see_also("mon_debug_dump_location"),
1988 	
1989 	    Option("mon_debug_dump_json", Option::TYPE_BOOL, Option::LEVEL_DEV)
1990 	    .set_default(false)
1991 	    .add_service("mon")
1992 	    .set_description("dump paxos transasctions to log as json")
1993 	    .add_see_also("mon_debug_dump_transactions"),
1994 	
1995 	    Option("mon_debug_dump_location", Option::TYPE_STR, Option::LEVEL_DEV)
1996 	    .set_default("/var/log/ceph/$cluster-$name.tdump")
1997 	    .add_service("mon")
1998 	    .set_description("file to dump paxos transactions to")
1999 	    .add_see_also("mon_debug_dump_transactions"),
2000 	
2001 	    Option("mon_debug_no_require_nautilus", Option::TYPE_BOOL, Option::LEVEL_DEV)
2002 	    .set_default(false)
2003 	    .add_service("mon")
2004 	    .set_flag(Option::FLAG_CLUSTER_CREATE)
2005 	    .set_description("do not set nautilus feature for new mon clusters"),
2006 	
2007 	    Option("mon_debug_no_require_octopus", Option::TYPE_BOOL, Option::LEVEL_DEV)
2008 	    .set_default(false)
2009 	    .add_service("mon")
2010 	    .set_flag(Option::FLAG_CLUSTER_CREATE)
2011 	    .set_description("do not set octopus feature for new mon clusters"),
2012 	
2013 	    Option("mon_debug_no_require_bluestore_for_ec_overwrites", Option::TYPE_BOOL, Option::LEVEL_DEV)
2014 	    .set_default(false)
2015 	    .add_service("mon")
2016 	    .set_description("do not require bluestore OSDs to enable EC overwrites on a rados pool"),
2017 	
2018 	    Option("mon_debug_no_initial_persistent_features", Option::TYPE_BOOL, Option::LEVEL_DEV)
2019 	    .set_default(false)
2020 	    .add_service("mon")
2021 	    .set_flag(Option::FLAG_CLUSTER_CREATE)
2022 	    .set_description("do not set any monmap features for new mon clusters"),
2023 	
2024 	    Option("mon_inject_transaction_delay_max", Option::TYPE_FLOAT, Option::LEVEL_DEV)
2025 	    .set_default(10.0)
2026 	    .add_service("mon")
2027 	    .set_description("max duration of injected delay in paxos"),
2028 	
2029 	    Option("mon_inject_transaction_delay_probability", Option::TYPE_FLOAT, Option::LEVEL_DEV)
2030 	    .set_default(0)
2031 	    .add_service("mon")
2032 	    .set_description("probability of injecting a delay in paxos"),
2033 	
2034 	    Option("mon_inject_pg_merge_bounce_probability", Option::TYPE_FLOAT, Option::LEVEL_DEV)
2035 	    .set_default(0)
2036 	    .add_service("mon")
2037 	    .set_description("probability of failing and reverting a pg_num decrement"),
2038 	
2039 	    Option("mon_sync_provider_kill_at", Option::TYPE_INT, Option::LEVEL_DEV)
2040 	    .set_default(0)
2041 	    .add_service("mon")
2042 	    .set_description("kill mon sync requester at specific point"),
2043 	
2044 	    Option("mon_sync_requester_kill_at", Option::TYPE_INT, Option::LEVEL_DEV)
2045 	    .set_default(0)
2046 	    .add_service("mon")
2047 	    .set_description("kill mon sync requestor at specific point"),
2048 	
2049 	    Option("mon_force_quorum_join", Option::TYPE_BOOL, Option::LEVEL_ADVANCED)
2050 	    .set_default(false)
2051 	    .add_service("mon")
2052 	    .set_description("force mon to rejoin quorum even though it was just removed"),
2053 	
2054 	    Option("mon_keyvaluedb", Option::TYPE_STR, Option::LEVEL_ADVANCED)
2055 	    .set_default("rocksdb")
2056 	    .set_enum_allowed({"leveldb", "rocksdb"})
2057 	    .set_flag(Option::FLAG_CREATE)
2058 	    .add_service("mon")
2059 	    .set_description("database backend to use for the mon database"),
2060 	
2061 	    Option("mon_debug_unsafe_allow_tier_with_nonempty_snaps", Option::TYPE_BOOL, Option::LEVEL_DEV)
2062 	    .set_default(false)
2063 	    .add_service("mon")
2064 	    .set_description(""),
2065 	
2066 	    Option("mon_osd_blacklist_default_expire", Option::TYPE_FLOAT, Option::LEVEL_ADVANCED)
2067 	    .set_default(1_hr)
2068 	    .add_service("mon")
2069 	    .set_description("Duration in seconds that blacklist entries for clients "
2070 	                     "remain in the OSD map"),
2071 	
2072 	    Option("mon_mds_blacklist_interval", Option::TYPE_FLOAT, Option::LEVEL_DEV)
2073 	    .set_default(1_day)
2074 	    .set_min(1_hr)
2075 	    .add_service("mon")
2076 	    .set_description("Duration in seconds that blacklist entries for MDS "
2077 	                     "daemons remain in the OSD map"),
2078 	
2079 	    Option("mon_osd_crush_smoke_test", Option::TYPE_BOOL, Option::LEVEL_ADVANCED)
2080 	    .set_default(true)
2081 	    .add_service("mon")
2082 	    .set_description("perform a smoke test on any new CRUSH map before accepting changes"),
2083 	
2084 	    Option("mon_smart_report_timeout", Option::TYPE_UINT, Option::LEVEL_ADVANCED)
2085 	    .set_default(5)
2086 	    .add_service("mon")
2087 	    .set_description("Timeout (in seconds) for smarctl to run, default is set to 5"),
2088 	
2089 	
2090 	    // PAXOS
2091 	
2092 	    Option("paxos_stash_full_interval", Option::TYPE_INT, Option::LEVEL_ADVANCED)
2093 	    .set_default(25)
2094 	    .add_service("mon")
2095 	    .set_description(""),
2096 	
2097 	    Option("paxos_max_join_drift", Option::TYPE_INT, Option::LEVEL_ADVANCED)
2098 	    .set_default(10)
2099 	    .add_service("mon")
2100 	    .set_description(""),
2101 	
2102 	    Option("paxos_propose_interval", Option::TYPE_FLOAT, Option::LEVEL_ADVANCED)
2103 	    .set_default(1.0)
2104 	    .add_service("mon")
2105 	    .set_description(""),
2106 	
2107 	    Option("paxos_min_wait", Option::TYPE_FLOAT, Option::LEVEL_ADVANCED)
2108 	    .set_default(0.05)
2109 	    .add_service("mon")
2110 	    .set_description(""),
2111 	
2112 	    Option("paxos_min", Option::TYPE_INT, Option::LEVEL_ADVANCED)
2113 	    .set_default(500)
2114 	    .add_service("mon")
2115 	    .set_description(""),
2116 	
2117 	    Option("paxos_trim_min", Option::TYPE_INT, Option::LEVEL_ADVANCED)
2118 	    .set_default(250)
2119 	    .add_service("mon")
2120 	    .set_description(""),
2121 	
2122 	    Option("paxos_trim_max", Option::TYPE_INT, Option::LEVEL_ADVANCED)
2123 	    .set_default(500)
2124 	    .add_service("mon")
2125 	    .set_description(""),
2126 	
2127 	    Option("paxos_service_trim_min", Option::TYPE_INT, Option::LEVEL_ADVANCED)
2128 	    .set_default(250)
2129 	    .add_service("mon")
2130 	    .set_description(""),
2131 	
2132 	    Option("paxos_service_trim_max", Option::TYPE_INT, Option::LEVEL_ADVANCED)
2133 	    .set_default(500)
2134 	    .add_service("mon")
2135 	    .set_description(""),
2136 	
2137 	    Option("paxos_kill_at", Option::TYPE_INT, Option::LEVEL_DEV)
2138 	    .set_default(0)
2139 	    .add_service("mon")
2140 	    .set_description(""),
2141 	
2142 	
2143 	    // AUTH
2144 	
2145 	    Option("auth_cluster_required", Option::TYPE_STR, Option::LEVEL_ADVANCED)
2146 	    .set_default("cephx")
2147 	    .set_description("authentication methods required by the cluster"),
2148 	
2149 	    Option("auth_service_required", Option::TYPE_STR, Option::LEVEL_ADVANCED)
2150 	    .set_default("cephx")
2151 	    .set_description("authentication methods required by service daemons"),
2152 	
2153 	    Option("auth_client_required", Option::TYPE_STR, Option::LEVEL_ADVANCED)
2154 	    .set_default("cephx, none")
2155 	    .set_flag(Option::FLAG_MINIMAL_CONF)
2156 	    .set_description("authentication methods allowed by clients"),
2157 	
2158 	    Option("auth_supported", Option::TYPE_STR, Option::LEVEL_ADVANCED)
2159 	    .set_default("")
2160 	    .set_description("authentication methods required (deprecated)"),
2161 	
2162 	    Option("max_rotating_auth_attempts", Option::TYPE_INT, Option::LEVEL_ADVANCED)
2163 	    .set_default(10)
2164 	    .set_description("number of attempts to initialize rotating keys before giving up"),
2165 	
2166 	    Option("rotating_keys_bootstrap_timeout", Option::TYPE_INT, Option::LEVEL_ADVANCED)
2167 	    .set_default(30)
2168 	    .set_description("timeout for obtaining rotating keys during bootstrap phase (seconds)"),
2169 	
2170 	    Option("rotating_keys_renewal_timeout", Option::TYPE_INT, Option::LEVEL_ADVANCED)
2171 	    .set_default(10)
2172 	    .set_description("timeout for updating rotating keys (seconds)"),
2173 	
2174 	    Option("cephx_require_signatures", Option::TYPE_BOOL, Option::LEVEL_ADVANCED)
2175 	    .set_default(false)
2176 	    .set_description(""),
2177 	
2178 	    Option("cephx_require_version", Option::TYPE_INT, Option::LEVEL_ADVANCED)
2179 	    .set_default(1)
2180 	    .set_description("Cephx version required (1 = pre-mimic, 2 = mimic+)"),
2181 	
2182 	    Option("cephx_cluster_require_signatures", Option::TYPE_BOOL, Option::LEVEL_ADVANCED)
2183 	    .set_default(false)
2184 	    .set_description(""),
2185 	
2186 	    Option("cephx_cluster_require_version", Option::TYPE_INT, Option::LEVEL_ADVANCED)
2187 	    .set_default(1)
2188 	    .set_description("Cephx version required by the cluster from clients (1 = pre-mimic, 2 = mimic+)"),
2189 	
2190 	    Option("cephx_service_require_signatures", Option::TYPE_BOOL, Option::LEVEL_ADVANCED)
2191 	    .set_default(false)
2192 	    .set_description(""),
2193 	
2194 	    Option("cephx_service_require_version", Option::TYPE_INT, Option::LEVEL_ADVANCED)
2195 	    .set_default(1)
2196 	    .set_description("Cephx version required from ceph services (1 = pre-mimic, 2 = mimic+)"),
2197 	
2198 	    Option("cephx_sign_messages", Option::TYPE_BOOL, Option::LEVEL_ADVANCED)
2199 	    .set_default(true)
2200 	    .set_description(""),
2201 	
2202 	    Option("auth_mon_ticket_ttl", Option::TYPE_FLOAT, Option::LEVEL_ADVANCED)
2203 	    .set_default(12_hr)
2204 	    .set_description(""),
2205 	
2206 	    Option("auth_service_ticket_ttl", Option::TYPE_FLOAT, Option::LEVEL_ADVANCED)
2207 	    .set_default(1_hr)
2208 	    .set_description(""),
2209 	
2210 	    Option("auth_debug", Option::TYPE_BOOL, Option::LEVEL_DEV)
2211 	    .set_default(false)
2212 	    .set_description(""),
2213 	
2214 	    Option("mon_client_hunt_parallel", Option::TYPE_UINT, Option::LEVEL_ADVANCED)
2215 	    .set_default(3)
2216 	    .set_description(""),
2217 	
2218 	    Option("mon_client_hunt_interval", Option::TYPE_FLOAT, Option::LEVEL_ADVANCED)
2219 	    .set_default(3.0)
2220 	    .set_description(""),
2221 	
2222 	    Option("mon_client_ping_interval", Option::TYPE_FLOAT, Option::LEVEL_ADVANCED)
2223 	    .set_default(10.0)
2224 	    .set_description(""),
2225 	
2226 	    Option("mon_client_ping_timeout", Option::TYPE_FLOAT, Option::LEVEL_ADVANCED)
2227 	    .set_default(30.0)
2228 	    .set_description(""),
2229 	
2230 	    Option("mon_client_hunt_interval_backoff", Option::TYPE_FLOAT, Option::LEVEL_ADVANCED)
2231 	    .set_default(1.5)
2232 	    .set_description(""),
2233 	
2234 	    Option("mon_client_hunt_interval_min_multiple", Option::TYPE_FLOAT, Option::LEVEL_ADVANCED)
2235 	    .set_default(1.0)
2236 	    .set_description(""),
2237 	
2238 	    Option("mon_client_hunt_interval_max_multiple", Option::TYPE_FLOAT, Option::LEVEL_ADVANCED)
2239 	    .set_default(10.0)
2240 	    .set_description(""),
2241 	
2242 	    Option("mon_client_max_log_entries_per_message", Option::TYPE_INT, Option::LEVEL_ADVANCED)
2243 	    .set_default(1000)
2244 	    .set_description(""),
2245 	
2246 	    Option("mon_client_directed_command_retry", Option::TYPE_INT, Option::LEVEL_DEV)
2247 	    .set_default(2)
2248 	    .set_description("Number of times to try sending a comamnd directed at a specific monitor"),
2249 	
2250 	    Option("mon_max_pool_pg_num", Option::TYPE_UINT, Option::LEVEL_ADVANCED)
2251 	    .set_default(65536)
2252 	    .set_description(""),
2253 	
2254 	    Option("mon_pool_quota_warn_threshold", Option::TYPE_INT, Option::LEVEL_ADVANCED)
2255 	    .set_default(0)
2256 	    .set_description("percent of quota at which to issue warnings")
2257 	    .add_service("mgr"),
2258 	
2259 	    Option("mon_pool_quota_crit_threshold", Option::TYPE_INT, Option::LEVEL_ADVANCED)
2260 	    .set_default(0)
2261 	    .set_description("percent of quota at which to issue errors")
2262 	    .add_service("mgr"),
2263 	
2264 	    Option("crush_location", Option::TYPE_STR, Option::LEVEL_ADVANCED)
2265 	    .set_default("")
2266 	    .set_description(""),
2267 	
2268 	    Option("crush_location_hook", Option::TYPE_STR, Option::LEVEL_ADVANCED)
2269 	    .set_default("")
2270 	    .set_description(""),
2271 	
2272 	    Option("crush_location_hook_timeout", Option::TYPE_INT, Option::LEVEL_ADVANCED)
2273 	    .set_default(10)
2274 	    .set_description(""),
2275 	
2276 	    Option("objecter_tick_interval", Option::TYPE_FLOAT, Option::LEVEL_DEV)
2277 	    .set_default(5.0)
2278 	    .set_description(""),
2279 	
2280 	    Option("objecter_timeout", Option::TYPE_FLOAT, Option::LEVEL_ADVANCED)
2281 	    .set_default(10.0)
2282 	    .set_description("Seconds before in-flight op is considered 'laggy' and we query mon for the latest OSDMap"),
2283 	
2284 	    Option("objecter_inflight_op_bytes", Option::TYPE_SIZE, Option::LEVEL_ADVANCED)
2285 	    .set_default(100_M)
2286 	    .set_description("Max in-flight data in bytes (both directions)"),
2287 	
2288 	    Option("objecter_inflight_ops", Option::TYPE_UINT, Option::LEVEL_ADVANCED)
2289 	    .set_default(1024)
2290 	    .set_description("Max in-flight operations"),
2291 	
2292 	    Option("objecter_completion_locks_per_session", Option::TYPE_UINT, Option::LEVEL_DEV)
2293 	    .set_default(32)
2294 	    .set_description(""),
2295 	
2296 	    Option("objecter_inject_no_watch_ping", Option::TYPE_BOOL, Option::LEVEL_DEV)
2297 	    .set_default(false)
2298 	    .set_description(""),
2299 	
2300 	    Option("objecter_retry_writes_after_first_reply", Option::TYPE_BOOL, Option::LEVEL_DEV)
2301 	    .set_default(false)
2302 	    .set_description(""),
2303 	
2304 	    Option("objecter_debug_inject_relock_delay", Option::TYPE_BOOL, Option::LEVEL_DEV)
2305 	    .set_default(false)
2306 	    .set_description(""),
2307 	
2308 	    Option("filer_max_purge_ops", Option::TYPE_UINT, Option::LEVEL_ADVANCED)
2309 	    .set_default(10)
2310 	    .set_description("Max in-flight operations for purging a striped range (e.g., MDS journal)"),
2311 	
2312 	    Option("filer_max_truncate_ops", Option::TYPE_UINT, Option::LEVEL_ADVANCED)
2313 	    .set_default(128)
2314 	    .set_description("Max in-flight operations for truncating/deleting a striped sequence (e.g., MDS journal)"),
2315 	
2316 	    Option("journaler_write_head_interval", Option::TYPE_INT, Option::LEVEL_ADVANCED)
2317 	    .set_default(15)
2318 	    .set_description("Interval in seconds between journal header updates (to help bound replay time)"),
2319 	
2320 	    // * journal object size
2321 	    Option("journaler_prefetch_periods", Option::TYPE_UINT, Option::LEVEL_ADVANCED)
2322 	    .set_default(10)
2323 	    .set_min(2)			// we need at least 2 periods to make progress.
2324 	    .set_description("Number of striping periods to prefetch while reading MDS journal"),
2325 	
2326 	    // * journal object size
2327 	    Option("journaler_prezero_periods", Option::TYPE_UINT, Option::LEVEL_ADVANCED)
2328 	    .set_default(5)
2329 	    // we need to zero at least two periods, minimum, to ensure that we
2330 	    // have a full empty object/period in front of us.
2331 	    .set_min(2)
2332 	    .set_description("Number of striping periods to zero head of MDS journal write position"),
2333 	
2334 	    // -- OSD --
2335 	    Option("osd_calc_pg_upmaps_aggressively", Option::TYPE_BOOL, Option::LEVEL_ADVANCED)
2336 	    .set_default(true)
2337 	    .set_flag(Option::FLAG_RUNTIME)
2338 	    .set_description("try to calculate PG upmaps more aggressively, e.g., "
2339 	                     "by doing a fairly exhaustive search of existing PGs "
2340 	                     "that can be unmapped or upmapped"),
2341 	
2342 	    Option("osd_calc_pg_upmaps_max_stddev", Option::TYPE_FLOAT, Option::LEVEL_ADVANCED)
2343 	    .set_default(1.0)
2344 	    .set_flag(Option::FLAG_RUNTIME)
2345 	    .set_description("standard deviation below which there is no attempt made "
2346 	                     "while trying to calculate PG upmaps"),
2347 	
2348 	    Option("osd_calc_pg_upmaps_local_fallback_retries", Option::TYPE_UINT, Option::LEVEL_ADVANCED)
2349 	    .set_default(100)
2350 	    .set_flag(Option::FLAG_RUNTIME)
2351 	    .set_description("Maximum number of PGs we can attempt to unmap or upmap "
2352 	                     "for a specific overfull or underfull osd per iteration "),
2353 	
2354 	    Option("osd_numa_prefer_iface", Option::TYPE_BOOL, Option::LEVEL_ADVANCED)
2355 	    .set_default(true)
2356 	    .set_flag(Option::FLAG_STARTUP)
2357 	    .set_description("prefer IP on network interface on same numa node as storage")
2358 	    .add_see_also("osd_numa_auto_affinity"),
2359 	
2360 	    Option("osd_numa_auto_affinity", Option::TYPE_BOOL, Option::LEVEL_ADVANCED)
2361 	    .set_default(true)
2362 	    .set_flag(Option::FLAG_STARTUP)
2363 	    .set_description("automatically set affinity to numa node when storage and network match"),
2364 	
2365 	    Option("osd_numa_node", Option::TYPE_INT, Option::LEVEL_ADVANCED)
2366 	    .set_default(-1)
2367 	    .set_flag(Option::FLAG_STARTUP)
2368 	    .set_description("set affinity to a numa node (-1 for none)")
2369 	    .add_see_also("osd_numa_auto_affinity"),
2370 	
2371 	    Option("osd_smart_report_timeout", Option::TYPE_UINT, Option::LEVEL_ADVANCED)
2372 	    .set_default(5)
2373 	    .set_description("Timeout (in seconds) for smarctl to run, default is set to 5"),
2374 	
2375 	    Option("osd_check_max_object_name_len_on_startup", Option::TYPE_BOOL, Option::LEVEL_DEV)
2376 	    .set_default(true)
2377 	    .set_description(""),
2378 	
2379 	    Option("osd_max_backfills", Option::TYPE_UINT, Option::LEVEL_ADVANCED)
2380 	    .set_default(1)
2381 	    .set_description("Maximum number of concurrent local and remote backfills or recoveries per OSD ")
2382 	    .set_long_description("There can be osd_max_backfills local reservations AND the same remote reservations per OSD. So a value of 1 lets this OSD participate as 1 PG primary in recovery and 1 shard of another recovering PG."),
2383 	
2384 	    Option("osd_min_recovery_priority", Option::TYPE_INT, Option::LEVEL_ADVANCED)
2385 	    .set_default(0)
2386 	    .set_description("Minimum priority below which recovery is not performed")
2387 	    .set_long_description("The purpose here is to prevent the cluster from doing *any* lower priority work (e.g., rebalancing) below this threshold and focus solely on higher priority work (e.g., replicating degraded objects)."),
2388 	
2389 	    Option("osd_backfill_retry_interval", Option::TYPE_FLOAT, Option::LEVEL_ADVANCED)
2390 	    .set_default(30.0)
2391 	    .set_description("how frequently to retry backfill reservations after being denied (e.g., due to a full OSD)"),
2392 	
2393 	    Option("osd_recovery_retry_interval", Option::TYPE_FLOAT, Option::LEVEL_ADVANCED)
2394 	    .set_default(30.0)
2395 	    .set_description("how frequently to retry recovery reservations after being denied (e.g., due to a full OSD)"),
2396 	
2397 	    Option("osd_agent_max_ops", Option::TYPE_INT, Option::LEVEL_ADVANCED)
2398 	    .set_default(4)
2399 	    .set_description("maximum concurrent tiering operations for tiering agent"),
2400 	
2401 	    Option("osd_agent_max_low_ops", Option::TYPE_INT, Option::LEVEL_ADVANCED)
2402 	    .set_default(2)
2403 	    .set_description("maximum concurrent low-priority tiering operations for tiering agent"),
2404 	
2405 	    Option("osd_agent_min_evict_effort", Option::TYPE_FLOAT, Option::LEVEL_ADVANCED)
2406 	    .set_default(.1)
2407 	    .set_min_max(0.0, .99)
2408 	    .set_description("minimum effort to expend evicting clean objects"),
2409 	
2410 	    Option("osd_agent_quantize_effort", Option::TYPE_FLOAT, Option::LEVEL_ADVANCED)
2411 	    .set_default(.1)
2412 	    .set_description("size of quantize unit for eviction effort"),
2413 	
2414 	    Option("osd_agent_delay_time", Option::TYPE_FLOAT, Option::LEVEL_ADVANCED)
2415 	    .set_default(5.0)
2416 	    .set_description("how long agent should sleep if it has no work to do"),
2417 	
2418 	    Option("osd_find_best_info_ignore_history_les", Option::TYPE_BOOL, Option::LEVEL_DEV)
2419 	    .set_default(false)
2420 	    .set_description("ignore last_epoch_started value when peering AND PROBABLY LOSE DATA")
2421 	    .set_long_description("THIS IS AN EXTREMELY DANGEROUS OPTION THAT SHOULD ONLY BE USED AT THE DIRECTION OF A DEVELOPER.  It makes peering ignore the last_epoch_started value when peering, which can allow the OSD to believe an OSD has an authoritative view of a PG's contents even when it is in fact old and stale, typically leading to data loss (by believing a stale PG is up to date)."),
2422 	
2423 	    Option("osd_agent_hist_halflife", Option::TYPE_INT, Option::LEVEL_ADVANCED)
2424 	    .set_default(1000)
2425 	    .set_description("halflife of agent atime and temp histograms"),
2426 	
2427 	    Option("osd_agent_slop", Option::TYPE_FLOAT, Option::LEVEL_ADVANCED)
2428 	    .set_default(.02)
2429 	    .set_description("slop factor to avoid switching tiering flush and eviction mode"),
2430 	
2431 	    Option("osd_uuid", Option::TYPE_UUID, Option::LEVEL_ADVANCED)
2432 	    .set_default(uuid_d())
2433 	    .set_flag(Option::FLAG_CREATE)
2434 	    .set_description("uuid label for a new OSD"),
2435 	
2436 	    Option("osd_data", Option::TYPE_STR, Option::LEVEL_ADVANCED)
2437 	    .set_default("/var/lib/ceph/osd/$cluster-$id")
2438 	    .set_flag(Option::FLAG_NO_MON_UPDATE)
2439 	    .set_description("path to OSD data"),
2440 	
2441 	    Option("osd_journal", Option::TYPE_STR, Option::LEVEL_ADVANCED)
2442 	    .set_default("/var/lib/ceph/osd/$cluster-$id/journal")
2443 	    .set_flag(Option::FLAG_NO_MON_UPDATE)
2444 	    .set_description("path to OSD journal (when FileStore backend is in use)"),
2445 	
2446 	    Option("osd_journal_size", Option::TYPE_SIZE, Option::LEVEL_ADVANCED)
2447 	    .set_default(5120)
2448 	    .set_flag(Option::FLAG_CREATE)
2449 	    .set_description("size of FileStore journal (in MiB)"),
2450 	
2451 	    Option("osd_journal_flush_on_shutdown", Option::TYPE_BOOL, Option::LEVEL_ADVANCED)
2452 	    .set_default(true)
2453 	    .set_description("flush FileStore journal contents during clean OSD shutdown"),
2454 	
2455 	    Option("osd_os_flags", Option::TYPE_UINT, Option::LEVEL_DEV)
2456 	    .set_default(0)
2457 	    .set_description("flags to skip filestore omap or journal initialization"),
2458 	
2459 	    Option("osd_max_write_size", Option::TYPE_SIZE, Option::LEVEL_ADVANCED)
2460 	    .set_min(4)
2461 	    .set_default(90)
2462 	    .set_description("Maximum size of a RADOS write operation in megabytes")
2463 	    .set_long_description("This setting prevents clients from doing "
2464 	        "very large writes to RADOS.  If you set this to a value "
2465 	        "below what clients expect, they will receive an error "
2466 	        "when attempting to write to the cluster."),
2467 	
2468 	    Option("osd_max_pgls", Option::TYPE_UINT, Option::LEVEL_ADVANCED)
2469 	    .set_default(1024)
2470 	    .set_description("maximum number of results when listing objects in a pool"),
2471 	
2472 	    Option("osd_client_message_size_cap", Option::TYPE_SIZE, Option::LEVEL_ADVANCED)
2473 	    .set_default(500_M)
2474 	    .set_description("maximum memory to devote to in-flight client requests")
2475 	    .set_long_description("If this value is exceeded, the OSD will not read any new client data off of the network until memory is freed."),
2476 	
2477 	    Option("osd_client_message_cap", Option::TYPE_UINT, Option::LEVEL_ADVANCED)
2478 	    .set_default(100)
2479 	    .set_description("maximum number of in-flight client requests"),
2480 	
2481 	    Option("osd_crush_update_weight_set", Option::TYPE_BOOL, Option::LEVEL_ADVANCED)
2482 	    .set_default(true)
2483 	    .set_description("update CRUSH weight-set weights when updating weights")
2484 	    .set_long_description("If this setting is true, we will update the weight-set weights when adjusting an item's weight, effectively making changes take effect immediately, and discarding any previous optimization in the weight-set value.  Setting this value to false will leave it to the balancer to (slowly, presumably) adjust weights to approach the new target value."),
2485 	
2486 	    Option("osd_crush_chooseleaf_type", Option::TYPE_INT, Option::LEVEL_DEV)
2487 	    .set_default(1)
2488 	    .set_flag(Option::FLAG_CREATE)
2489 	    .set_description("default chooseleaf type for osdmaptool --create"),
2490 	
2491 	    Option("osd_pool_use_gmt_hitset", Option::TYPE_BOOL, Option::LEVEL_DEV)
2492 	    .set_default(true)
2493 	    .set_description("use UTC for hitset timestamps")
2494 	    .set_long_description("This setting only exists for compatibility with hammer (and older) clusters."),
2495 	
2496 	    Option("osd_crush_update_on_start", Option::TYPE_BOOL, Option::LEVEL_ADVANCED)
2497 	    .set_default(true)
2498 	    .set_description("update OSD CRUSH location on startup"),
2499 	
2500 	    Option("osd_class_update_on_start", Option::TYPE_BOOL, Option::LEVEL_ADVANCED)
2501 	    .set_default(true)
2502 	    .set_description("set OSD device class on startup"),
2503 	
2504 	    Option("osd_crush_initial_weight", Option::TYPE_FLOAT, Option::LEVEL_ADVANCED)
2505 	    .set_default(-1)
2506 	    .set_description("if >= 0, initial CRUSH weight for newly created OSDs")
2507 	    .set_long_description("If this value is negative, the size of the OSD in TiB is used."),
2508 	
2509 	    Option("osd_pool_default_ec_fast_read", Option::TYPE_BOOL, Option::LEVEL_ADVANCED)
2510 	    .set_default(false)
2511 	    .set_description("set ec_fast_read for new erasure-coded pools")
2512 	    .add_service("mon"),
2513 	
2514 	    Option("osd_pool_default_crush_rule", Option::TYPE_INT, Option::LEVEL_ADVANCED)
2515 	    .set_default(-1)
2516 	    .set_description("CRUSH rule for newly created pools")
2517 	    .add_service("mon"),
2518 	
2519 	    Option("osd_pool_erasure_code_stripe_unit", Option::TYPE_SIZE, Option::LEVEL_ADVANCED)
2520 	    .set_default(4_K)
2521 	    .set_description("the amount of data (in bytes) in a data chunk, per stripe")
2522 	    .add_service("mon"),
2523 	
2524 	    Option("osd_pool_default_size", Option::TYPE_UINT, Option::LEVEL_ADVANCED)
2525 	    .set_default(3)
2526 	    .set_min_max(0, 10)
2527 	    .set_flag(Option::FLAG_RUNTIME)
2528 	    .set_description("the number of copies of an object for new replicated pools")
2529 	    .add_service("mon"),
2530 	
2531 	    Option("osd_pool_default_min_size", Option::TYPE_UINT, Option::LEVEL_ADVANCED)
2532 	    .set_default(0)
2533 	    .set_min_max(0, 255)
2534 	    .set_flag(Option::FLAG_RUNTIME)
2535 	    .set_description("the minimal number of copies allowed to write to a degraded pool for new replicated pools")
2536 	    .set_long_description("0 means no specific default; ceph will use size-size/2")
2537 	    .add_see_also("osd_pool_default_size")
2538 	    .add_service("mon"),
2539 	
2540 	    Option("osd_pool_default_pg_num", Option::TYPE_UINT, Option::LEVEL_ADVANCED)
2541 	    .set_default(8)
2542 	    .set_description("number of PGs for new pools")
2543 	    .set_flag(Option::FLAG_RUNTIME)
2544 	    .add_service("mon"),
2545 	
2546 	    Option("osd_pool_default_pgp_num", Option::TYPE_UINT, Option::LEVEL_ADVANCED)
2547 	    .set_default(0)
2548 	    .set_description("number of PGs for placement purposes (0 to match pg_num)")
2549 	    .add_see_also("osd_pool_default_pg_num")
2550 	    .set_flag(Option::FLAG_RUNTIME)
2551 	    .add_service("mon"),
2552 	
2553 	    Option("osd_pool_default_type", Option::TYPE_STR, Option::LEVEL_ADVANCED)
2554 	    .set_default("replicated")
2555 	    .set_enum_allowed({"replicated", "erasure"})
2556 	    .set_flag(Option::FLAG_RUNTIME)
2557 	    .set_description("default type of pool to create")
2558 	    .add_service("mon"),
2559 	
2560 	    Option("osd_pool_default_erasure_code_profile", Option::TYPE_STR, Option::LEVEL_ADVANCED)
2561 	    .set_default("plugin=jerasure technique=reed_sol_van k=2 m=2")
2562 	    .set_flag(Option::FLAG_RUNTIME)
2563 	    .set_description("default erasure code profile for new erasure-coded pools")
2564 	    .add_service("mon"),
2565 	
2566 	    Option("osd_erasure_code_plugins", Option::TYPE_STR, Option::LEVEL_ADVANCED)
2567 	    .set_default("jerasure lrc"
2568 	  #ifdef HAVE_BETTER_YASM_ELF64
2569 	         " isa"
2570 	  #endif
2571 	        )
2572 	    .set_flag(Option::FLAG_STARTUP)
2573 	    .set_description("erasure code plugins to load")
2574 	    .add_service("mon")
2575 	    .add_service("osd"),
2576 	
2577 	    Option("osd_allow_recovery_below_min_size", Option::TYPE_BOOL, Option::LEVEL_DEV)
2578 	    .set_default(true)
2579 	    .set_description("allow replicated pools to recover with < min_size active members")
2580 	    .add_service("osd"),
2581 	
2582 	    Option("osd_pool_default_flags", Option::TYPE_INT, Option::LEVEL_DEV)
2583 	    .set_default(0)
2584 	    .set_description("(integer) flags to set on new pools")
2585 	    .add_service("mon"),
2586 	
2587 	    Option("osd_pool_default_flag_hashpspool", Option::TYPE_BOOL, Option::LEVEL_ADVANCED)
2588 	    .set_default(true)
2589 	    .set_description("set hashpspool (better hashing scheme) flag on new pools")
2590 	    .add_service("mon"),
2591 	
2592 	    Option("osd_pool_default_flag_nodelete", Option::TYPE_BOOL, Option::LEVEL_ADVANCED)
2593 	    .set_default(false)
2594 	    .set_description("set nodelete flag on new pools")
2595 	    .add_service("mon"),
2596 	
2597 	    Option("osd_pool_default_flag_nopgchange", Option::TYPE_BOOL, Option::LEVEL_ADVANCED)
2598 	    .set_default(false)
2599 	    .set_description("set nopgchange flag on new pools")
2600 	    .add_service("mon"),
2601 	
2602 	    Option("osd_pool_default_flag_nosizechange", Option::TYPE_BOOL, Option::LEVEL_ADVANCED)
2603 	    .set_default(false)
2604 	    .set_description("set nosizechange flag on new pools")
2605 	    .add_service("mon"),
2606 	
2607 	    Option("osd_pool_default_hit_set_bloom_fpp", Option::TYPE_FLOAT, Option::LEVEL_ADVANCED)
2608 	    .set_default(.05)
2609 	    .set_description("")
2610 	    .add_see_also("osd_tier_default_cache_hit_set_type")
2611 	    .add_service("mon"),
2612 	
2613 	    Option("osd_pool_default_cache_target_dirty_ratio", Option::TYPE_FLOAT, Option::LEVEL_ADVANCED)
2614 	    .set_default(.4)
2615 	    .set_description(""),
2616 	
2617 	    Option("osd_pool_default_cache_target_dirty_high_ratio", Option::TYPE_FLOAT, Option::LEVEL_ADVANCED)
2618 	    .set_default(.6)
2619 	    .set_description(""),
2620 	
2621 	    Option("osd_pool_default_cache_target_full_ratio", Option::TYPE_FLOAT, Option::LEVEL_ADVANCED)
2622 	    .set_default(.8)
2623 	    .set_description(""),
2624 	
2625 	    Option("osd_pool_default_cache_min_flush_age", Option::TYPE_INT, Option::LEVEL_ADVANCED)
2626 	    .set_default(0)
2627 	    .set_description(""),
2628 	
2629 	    Option("osd_pool_default_cache_min_evict_age", Option::TYPE_INT, Option::LEVEL_ADVANCED)
2630 	    .set_default(0)
2631 	    .set_description(""),
2632 	
2633 	    Option("osd_pool_default_cache_max_evict_check_size", Option::TYPE_INT, Option::LEVEL_ADVANCED)
2634 	    .set_default(10)
2635 	    .set_description(""),
2636 	
2637 	    Option("osd_pool_default_pg_autoscale_mode", Option::TYPE_STR, Option::LEVEL_ADVANCED)
2638 	    .set_default("on")
2639 	    .set_flag(Option::FLAG_RUNTIME)
2640 	    .set_enum_allowed({"off", "warn", "on"})
2641 	    .set_description("Default PG autoscaling behavior for new pools"),
2642 	
2643 	    Option("osd_pool_default_read_lease_ratio", Option::TYPE_FLOAT, Option::LEVEL_DEV)
2644 	    .set_default(.8)
2645 	    .set_flag(Option::FLAG_RUNTIME)
2646 	    .set_description("Default read_lease_ratio for a pool, as a multiple of osd_heartbeat_grace")
2647 	    .set_long_description("This should be <= 1.0 so that the read lease will have expired by the time we decide to mark a peer OSD down.")
2648 	    .add_see_also("osd_heartbeat_grace"),
2649 	
2650 	    Option("osd_hit_set_min_size", Option::TYPE_INT, Option::LEVEL_ADVANCED)
2651 	    .set_default(1000)
2652 	    .set_description(""),
2653 	
2654 	    Option("osd_hit_set_max_size", Option::TYPE_INT, Option::LEVEL_ADVANCED)
2655 	    .set_default(100000)
2656 	    .set_description(""),
2657 	
2658 	    Option("osd_hit_set_namespace", Option::TYPE_STR, Option::LEVEL_ADVANCED)
2659 	    .set_default(".ceph-internal")
2660 	    .set_description(""),
2661 	
2662 	    Option("osd_tier_promote_max_objects_sec", Option::TYPE_UINT, Option::LEVEL_ADVANCED)
2663 	    .set_default(25)
2664 	    .set_description(""),
2665 	
2666 	    Option("osd_tier_promote_max_bytes_sec", Option::TYPE_SIZE, Option::LEVEL_ADVANCED)
2667 	    .set_default(5_M)
2668 	    .set_description(""),
2669 	
2670 	    Option("osd_tier_default_cache_mode", Option::TYPE_STR, Option::LEVEL_ADVANCED)
2671 	    .set_default("writeback")
2672 	    .set_enum_allowed({"none", "writeback", "forward",
2673 		               "readonly", "readforward", "readproxy", "proxy"})
2674 	    .set_flag(Option::FLAG_RUNTIME)
2675 	    .set_description(""),
2676 	
2677 	    Option("osd_tier_default_cache_hit_set_count", Option::TYPE_UINT, Option::LEVEL_ADVANCED)
2678 	    .set_default(4)
2679 	    .set_description(""),
2680 	
2681 	    Option("osd_tier_default_cache_hit_set_period", Option::TYPE_UINT, Option::LEVEL_ADVANCED)
2682 	    .set_default(1200)
2683 	    .set_description(""),
2684 	
2685 	    Option("osd_tier_default_cache_hit_set_type", Option::TYPE_STR, Option::LEVEL_ADVANCED)
2686 	    .set_default("bloom")
2687 	    .set_enum_allowed({"bloom", "explicit_hash", "explicit_object"})
2688 	    .set_flag(Option::FLAG_RUNTIME)
2689 	    .set_description(""),
2690 	
2691 	    Option("osd_tier_default_cache_min_read_recency_for_promote", Option::TYPE_UINT, Option::LEVEL_ADVANCED)
2692 	    .set_default(1)
2693 	    .set_description("number of recent HitSets the object must appear in to be promoted (on read)"),
2694 	
2695 	    Option("osd_tier_default_cache_min_write_recency_for_promote", Option::TYPE_UINT, Option::LEVEL_ADVANCED)
2696 	    .set_default(1)
2697 	    .set_description("number of recent HitSets the object must appear in to be promoted (on write)"),
2698 	
2699 	    Option("osd_tier_default_cache_hit_set_grade_decay_rate", Option::TYPE_UINT, Option::LEVEL_ADVANCED)
2700 	    .set_default(20)
2701 	    .set_description(""),
2702 	
2703 	    Option("osd_tier_default_cache_hit_set_search_last_n", Option::TYPE_UINT, Option::LEVEL_ADVANCED)
2704 	    .set_default(1)
2705 	    .set_description(""),
2706 	
2707 	    Option("osd_objecter_finishers", Option::TYPE_INT, Option::LEVEL_ADVANCED)
2708 	    .set_default(1)
2709 	    .set_flag(Option::FLAG_STARTUP)
2710 	    .set_description(""),
2711 	
2712 	    Option("osd_map_dedup", Option::TYPE_BOOL, Option::LEVEL_ADVANCED)
2713 	    .set_default(true)
2714 	    .set_description(""),
2715 	
2716 	    Option("osd_map_cache_size", Option::TYPE_INT, Option::LEVEL_ADVANCED)
2717 	    .set_default(50)
2718 	    .set_description(""),
2719 	
2720 	    Option("osd_map_message_max", Option::TYPE_INT, Option::LEVEL_ADVANCED)
2721 	    .set_default(40)
2722 	    .set_description("maximum number of OSDMaps to include in a single message"),
2723 	
2724 	    Option("osd_map_message_max_bytes", Option::TYPE_SIZE, Option::LEVEL_ADVANCED)
2725 	    .set_default(10_M)
2726 	    .set_description("maximum number of bytes worth of OSDMaps to include in a single message"),
2727 	
2728 	    Option("osd_map_share_max_epochs", Option::TYPE_INT, Option::LEVEL_ADVANCED)
2729 	    .set_default(40)
2730 	    .set_description(""),
2731 	
2732 	    Option("osd_pg_epoch_max_lag_factor", Option::TYPE_FLOAT, Option::LEVEL_ADVANCED)
2733 	    .set_default(2.0)
2734 	    .set_description("Max multiple of the map cache that PGs can lag before we throttle map injest")
2735 	    .add_see_also("osd_map_cache_size"),
2736 	
2737 	    Option("osd_inject_bad_map_crc_probability", Option::TYPE_FLOAT, Option::LEVEL_DEV)
2738 	    .set_default(0)
2739 	    .set_description(""),
2740 	
2741 	    Option("osd_inject_failure_on_pg_removal", Option::TYPE_BOOL, Option::LEVEL_DEV)
2742 	    .set_default(false)
2743 	    .set_description(""),
2744 	
2745 	    Option("osd_max_markdown_period", Option::TYPE_INT, Option::LEVEL_ADVANCED)
2746 	    .set_default(600)
2747 	    .set_description(""),
2748 	
2749 	    Option("osd_max_markdown_count", Option::TYPE_INT, Option::LEVEL_ADVANCED)
2750 	    .set_default(5)
2751 	    .set_description(""),
2752 	
2753 	    Option("osd_op_pq_max_tokens_per_priority", Option::TYPE_UINT, Option::LEVEL_ADVANCED)
2754 	    .set_default(4194304)
2755 	    .set_description(""),
2756 	
2757 	    Option("osd_op_pq_min_cost", Option::TYPE_SIZE, Option::LEVEL_ADVANCED)
2758 	    .set_default(65536)
2759 	    .set_description(""),
2760 	
2761 	    Option("osd_recover_clone_overlap", Option::TYPE_BOOL, Option::LEVEL_ADVANCED)
2762 	    .set_default(true)
2763 	    .set_description(""),
2764 	
2765 	    Option("osd_op_num_threads_per_shard", Option::TYPE_INT, Option::LEVEL_ADVANCED)
2766 	    .set_default(0)
2767 	    .set_flag(Option::FLAG_STARTUP)
2768 	    .set_description(""),
2769 	
2770 	    Option("osd_op_num_threads_per_shard_hdd", Option::TYPE_INT, Option::LEVEL_ADVANCED)
2771 	    .set_default(1)
2772 	    .set_flag(Option::FLAG_STARTUP)
2773 	    .set_description("")
2774 	    .add_see_also("osd_op_num_threads_per_shard"),
2775 	
2776 	    Option("osd_op_num_threads_per_shard_ssd", Option::TYPE_INT, Option::LEVEL_ADVANCED)
2777 	    .set_default(2)
2778 	    .set_flag(Option::FLAG_STARTUP)
2779 	    .set_description("")
2780 	    .add_see_also("osd_op_num_threads_per_shard"),
2781 	
2782 	    Option("osd_op_num_shards", Option::TYPE_INT, Option::LEVEL_ADVANCED)
2783 	    .set_default(0)
2784 	    .set_flag(Option::FLAG_STARTUP)
2785 	    .set_description(""),
2786 	
2787 	    Option("osd_op_num_shards_hdd", Option::TYPE_INT, Option::LEVEL_ADVANCED)
2788 	    .set_default(5)
2789 	    .set_flag(Option::FLAG_STARTUP)
2790 	    .set_description("")
2791 	    .add_see_also("osd_op_num_shards"),
2792 	
2793 	    Option("osd_op_num_shards_ssd", Option::TYPE_INT, Option::LEVEL_ADVANCED)
2794 	    .set_default(8)
2795 	    .set_flag(Option::FLAG_STARTUP)
2796 	    .set_description("")
2797 	    .add_see_also("osd_op_num_shards"),
2798 	
2799 	    Option("osd_skip_data_digest", Option::TYPE_BOOL, Option::LEVEL_DEV)
2800 	    .set_default(false)
2801 	    .set_description("Do not store full-object checksums if the backend (bluestore) does its own checksums.  Only usable with all BlueStore OSDs."),
2802 	
2803 	    Option("osd_op_queue", Option::TYPE_STR, Option::LEVEL_ADVANCED)
2804 	    .set_default("wpq")
2805 	    .set_enum_allowed( { "wpq", "prioritized", "mclock_opclass", "mclock_client", "debug_random" } )
2806 	    .set_description("which operation queue algorithm to use")
2807 	    .set_long_description("which operation queue algorithm to use; mclock_opclass and mclock_client are currently experimental")
2808 	    .set_flag(Option::FLAG_STARTUP)
2809 	    .add_see_also("osd_op_queue_cut_off"),
2810 	
2811 	    Option("osd_op_queue_cut_off", Option::TYPE_STR, Option::LEVEL_ADVANCED)
2812 	    .set_default("high")
2813 	    .set_enum_allowed( { "low", "high", "debug_random" } )
2814 	    .set_description("the threshold between high priority ops and low priority ops")
2815 	    .set_long_description("the threshold between high priority ops that use strict priority ordering and low priority ops that use a fairness algorithm that may or may not incorporate priority")
2816 	    .add_see_also("osd_op_queue"),
2817 	
2818 	    Option("osd_op_queue_mclock_client_op_res", Option::TYPE_FLOAT, Option::LEVEL_ADVANCED)
2819 	    .set_default(1000.0)
2820 	    .set_description("mclock reservation of client operator requests")
2821 	    .set_long_description("mclock reservation of client operator requests when osd_op_queue is either 'mclock_opclass' or 'mclock_client'; higher values increase the reservation")
2822 	    .add_see_also("osd_op_queue")
2823 	    .add_see_also("osd_op_queue_mclock_client_op_wgt")
2824 	    .add_see_also("osd_op_queue_mclock_client_op_lim")
2825 	    .add_see_also("osd_op_queue_mclock_osd_rep_op_res")
2826 	    .add_see_also("osd_op_queue_mclock_osd_rep_op_wgt")
2827 	    .add_see_also("osd_op_queue_mclock_osd_rep_op_lim")
2828 	    .add_see_also("osd_op_queue_mclock_snap_res")
2829 	    .add_see_also("osd_op_queue_mclock_snap_wgt")
2830 	    .add_see_also("osd_op_queue_mclock_snap_lim")
2831 	    .add_see_also("osd_op_queue_mclock_recov_res")
2832 	    .add_see_also("osd_op_queue_mclock_recov_wgt")
2833 	    .add_see_also("osd_op_queue_mclock_recov_lim")
2834 	    .add_see_also("osd_op_queue_mclock_scrub_res")
2835 	    .add_see_also("osd_op_queue_mclock_scrub_wgt")
2836 	    .add_see_also("osd_op_queue_mclock_scrub_lim")
2837 	    .add_see_also("osd_op_queue_mclock_anticipation_timeout"),
2838 	
2839 	    Option("osd_op_queue_mclock_client_op_wgt", Option::TYPE_FLOAT, Option::LEVEL_ADVANCED)
2840 	    .set_default(500.0)
2841 	    .set_description("mclock weight of client operator requests")
2842 	    .set_long_description("mclock weight of client operator requests when osd_op_queue is either 'mclock_opclass' or 'mclock_client'; higher values increase the weight")
2843 	    .add_see_also("osd_op_queue")
2844 	    .add_see_also("osd_op_queue_mclock_client_op_res")
2845 	    .add_see_also("osd_op_queue_mclock_client_op_lim")
2846 	    .add_see_also("osd_op_queue_mclock_osd_rep_op_res")
2847 	    .add_see_also("osd_op_queue_mclock_osd_rep_op_wgt")
2848 	    .add_see_also("osd_op_queue_mclock_osd_rep_op_lim")
2849 	    .add_see_also("osd_op_queue_mclock_snap_res")
2850 	    .add_see_also("osd_op_queue_mclock_snap_wgt")
2851 	    .add_see_also("osd_op_queue_mclock_snap_lim")
2852 	    .add_see_also("osd_op_queue_mclock_recov_res")
2853 	    .add_see_also("osd_op_queue_mclock_recov_wgt")
2854 	    .add_see_also("osd_op_queue_mclock_recov_lim")
2855 	    .add_see_also("osd_op_queue_mclock_scrub_res")
2856 	    .add_see_also("osd_op_queue_mclock_scrub_wgt")
2857 	    .add_see_also("osd_op_queue_mclock_scrub_lim")
2858 	    .add_see_also("osd_op_queue_mclock_anticipation_timeout"),
2859 	
2860 	    Option("osd_op_queue_mclock_client_op_lim", Option::TYPE_FLOAT, Option::LEVEL_ADVANCED)
2861 	    .set_default(0.0)
2862 	    .set_description("mclock limit of client operator requests")
2863 	    .set_long_description("mclock limit of client operator requests when osd_op_queue is either 'mclock_opclass' or 'mclock_client'; higher values increase the limit")
2864 	    .add_see_also("osd_op_queue")
2865 	    .add_see_also("osd_op_queue_mclock_client_op_res")
2866 	    .add_see_also("osd_op_queue_mclock_client_op_wgt")
2867 	    .add_see_also("osd_op_queue_mclock_osd_rep_op_res")
2868 	    .add_see_also("osd_op_queue_mclock_osd_rep_op_wgt")
2869 	    .add_see_also("osd_op_queue_mclock_osd_rep_op_lim")
2870 	    .add_see_also("osd_op_queue_mclock_snap_res")
2871 	    .add_see_also("osd_op_queue_mclock_snap_wgt")
2872 	    .add_see_also("osd_op_queue_mclock_snap_lim")
2873 	    .add_see_also("osd_op_queue_mclock_recov_res")
2874 	    .add_see_also("osd_op_queue_mclock_recov_wgt")
2875 	    .add_see_also("osd_op_queue_mclock_recov_lim")
2876 	    .add_see_also("osd_op_queue_mclock_scrub_res")
2877 	    .add_see_also("osd_op_queue_mclock_scrub_wgt")
2878 	    .add_see_also("osd_op_queue_mclock_scrub_lim")
2879 	    .add_see_also("osd_op_queue_mclock_anticipation_timeout"),
2880 	
2881 	    Option("osd_op_queue_mclock_osd_rep_op_res", Option::TYPE_FLOAT, Option::LEVEL_ADVANCED)
2882 	    .set_default(1000.0)
2883 	    .set_description("mclock reservation of osd replication operation requests and replies")
2884 	    .set_long_description("mclock reservation of replication operation requests and replies when osd_op_queue is either 'mclock_opclass' or 'mclock_client'; higher values increase the reservation")
2885 	    .add_see_also("osd_op_queue")
2886 	    .add_see_also("osd_op_queue_mclock_client_op_res")
2887 	    .add_see_also("osd_op_queue_mclock_client_op_wgt")
2888 	    .add_see_also("osd_op_queue_mclock_client_op_lim")
2889 	    .add_see_also("osd_op_queue_mclock_osd_rep_op_wgt")
2890 	    .add_see_also("osd_op_queue_mclock_osd_rep_op_lim")
2891 	    .add_see_also("osd_op_queue_mclock_snap_res")
2892 	    .add_see_also("osd_op_queue_mclock_snap_wgt")
2893 	    .add_see_also("osd_op_queue_mclock_snap_lim")
2894 	    .add_see_also("osd_op_queue_mclock_recov_res")
2895 	    .add_see_also("osd_op_queue_mclock_recov_wgt")
2896 	    .add_see_also("osd_op_queue_mclock_recov_lim")
2897 	    .add_see_also("osd_op_queue_mclock_scrub_res")
2898 	    .add_see_also("osd_op_queue_mclock_scrub_wgt")
2899 	    .add_see_also("osd_op_queue_mclock_scrub_lim")
2900 	    .add_see_also("osd_op_queue_mclock_anticipation_timeout"),
2901 	
2902 	    Option("osd_op_queue_mclock_osd_rep_op_wgt", Option::TYPE_FLOAT, Option::LEVEL_ADVANCED)
2903 	    .set_default(500.0)
2904 	    .set_description("mclock weight of osd replication operation requests and replies")
2905 	    .set_long_description("mclock weight of osd replication operation requests and replies when osd_op_queue is either 'mclock_opclass' or 'mclock_client'; higher values increase the weight")
2906 	    .add_see_also("osd_op_queue")
2907 	    .add_see_also("osd_op_queue_mclock_client_op_res")
2908 	    .add_see_also("osd_op_queue_mclock_client_op_wgt")
2909 	    .add_see_also("osd_op_queue_mclock_client_op_lim")
2910 	    .add_see_also("osd_op_queue_mclock_osd_rep_op_res")
2911 	    .add_see_also("osd_op_queue_mclock_osd_rep_op_lim")
2912 	    .add_see_also("osd_op_queue_mclock_snap_res")
2913 	    .add_see_also("osd_op_queue_mclock_snap_wgt")
2914 	    .add_see_also("osd_op_queue_mclock_snap_lim")
2915 	    .add_see_also("osd_op_queue_mclock_recov_res")
2916 	    .add_see_also("osd_op_queue_mclock_recov_wgt")
2917 	    .add_see_also("osd_op_queue_mclock_recov_lim")
2918 	    .add_see_also("osd_op_queue_mclock_scrub_res")
2919 	    .add_see_also("osd_op_queue_mclock_scrub_wgt")
2920 	    .add_see_also("osd_op_queue_mclock_scrub_lim")
2921 	    .add_see_also("osd_op_queue_mclock_anticipation_timeout"),
2922 	
2923 	    Option("osd_op_queue_mclock_osd_rep_op_lim", Option::TYPE_FLOAT, Option::LEVEL_ADVANCED)
2924 	    .set_default(0.0)
2925 	    .set_description("mclock limit of osd replication operation requests and replies")
2926 	    .set_long_description("mclock limit of osd sub-operation requests when osd_op_queue is either 'mclock_opclass' or 'mclock_client'; higher values increase the limit")
2927 	    .add_see_also("osd_op_queue")
2928 	    .add_see_also("osd_op_queue_mclock_client_op_res")
2929 	    .add_see_also("osd_op_queue_mclock_client_op_wgt")
2930 	    .add_see_also("osd_op_queue_mclock_client_op_lim")
2931 	    .add_see_also("osd_op_queue_mclock_osd_rep_op_res")
2932 	    .add_see_also("osd_op_queue_mclock_osd_rep_op_wgt")
2933 	    .add_see_also("osd_op_queue_mclock_snap_res")
2934 	    .add_see_also("osd_op_queue_mclock_snap_wgt")
2935 	    .add_see_also("osd_op_queue_mclock_snap_lim")
2936 	    .add_see_also("osd_op_queue_mclock_recov_res")
2937 	    .add_see_also("osd_op_queue_mclock_recov_wgt")
2938 	    .add_see_also("osd_op_queue_mclock_recov_lim")
2939 	    .add_see_also("osd_op_queue_mclock_scrub_res")
2940 	    .add_see_also("osd_op_queue_mclock_scrub_wgt")
2941 	    .add_see_also("osd_op_queue_mclock_scrub_lim")
2942 	    .add_see_also("osd_op_queue_mclock_anticipation_timeout"),
2943 	
2944 	    Option("osd_op_queue_mclock_snap_res", Option::TYPE_FLOAT, Option::LEVEL_ADVANCED)
2945 	    .set_default(0.0)
2946 	    .set_description("mclock reservation of snaptrim requests")
2947 	    .set_long_description("mclock reservation of snaptrim requests when osd_op_queue is either 'mclock_opclass' or 'mclock_client'; higher values increase the reservation")
2948 	    .add_see_also("osd_op_queue")
2949 	    .add_see_also("osd_op_queue_mclock_client_op_res")
2950 	    .add_see_also("osd_op_queue_mclock_client_op_wgt")
2951 	    .add_see_also("osd_op_queue_mclock_client_op_lim")
2952 	    .add_see_also("osd_op_queue_mclock_osd_rep_op_res")
2953 	    .add_see_also("osd_op_queue_mclock_osd_rep_op_wgt")
2954 	    .add_see_also("osd_op_queue_mclock_osd_rep_op_lim")
2955 	    .add_see_also("osd_op_queue_mclock_snap_wgt")
2956 	    .add_see_also("osd_op_queue_mclock_snap_lim")
2957 	    .add_see_also("osd_op_queue_mclock_recov_res")
2958 	    .add_see_also("osd_op_queue_mclock_recov_wgt")
2959 	    .add_see_also("osd_op_queue_mclock_recov_lim")
2960 	    .add_see_also("osd_op_queue_mclock_scrub_res")
2961 	    .add_see_also("osd_op_queue_mclock_scrub_wgt")
2962 	    .add_see_also("osd_op_queue_mclock_scrub_lim")
2963 	    .add_see_also("osd_op_queue_mclock_anticipation_timeout"),
2964 	
2965 	    Option("osd_op_queue_mclock_snap_wgt", Option::TYPE_FLOAT, Option::LEVEL_ADVANCED)
2966 	    .set_default(1.0)
2967 	    .set_description("mclock weight of snaptrim requests")
2968 	    .set_long_description("mclock weight of snaptrim requests when osd_op_queue is either 'mclock_opclass' or 'mclock_client'; higher values increase the weight")
2969 	    .add_see_also("osd_op_queue")
2970 	    .add_see_also("osd_op_queue_mclock_client_op_res")
2971 	    .add_see_also("osd_op_queue_mclock_client_op_wgt")
2972 	    .add_see_also("osd_op_queue_mclock_client_op_lim")
2973 	    .add_see_also("osd_op_queue_mclock_osd_rep_op_res")
2974 	    .add_see_also("osd_op_queue_mclock_osd_rep_op_wgt")
2975 	    .add_see_also("osd_op_queue_mclock_osd_rep_op_lim")
2976 	    .add_see_also("osd_op_queue_mclock_snap_res")
2977 	    .add_see_also("osd_op_queue_mclock_snap_lim")
2978 	    .add_see_also("osd_op_queue_mclock_recov_res")
2979 	    .add_see_also("osd_op_queue_mclock_recov_wgt")
2980 	    .add_see_also("osd_op_queue_mclock_recov_lim")
2981 	    .add_see_also("osd_op_queue_mclock_scrub_res")
2982 	    .add_see_also("osd_op_queue_mclock_scrub_wgt")
2983 	    .add_see_also("osd_op_queue_mclock_scrub_lim")
2984 	    .add_see_also("osd_op_queue_mclock_anticipation_timeout"),
2985 	
2986 	    Option("osd_op_queue_mclock_snap_lim", Option::TYPE_FLOAT, Option::LEVEL_ADVANCED)
2987 	    .set_default(0.001)
2988 	    .set_description("")
2989 	    .set_description("mclock limit of snaptrim requests")
2990 	    .set_long_description("mclock limit of snaptrim requests when osd_op_queue is either 'mclock_opclass' or 'mclock_client'; higher values increase the limit")
2991 	    .add_see_also("osd_op_queue_mclock_client_op_res")
2992 	    .add_see_also("osd_op_queue_mclock_client_op_wgt")
2993 	    .add_see_also("osd_op_queue_mclock_client_op_lim")
2994 	    .add_see_also("osd_op_queue_mclock_osd_rep_op_res")
2995 	    .add_see_also("osd_op_queue_mclock_osd_rep_op_wgt")
2996 	    .add_see_also("osd_op_queue_mclock_osd_rep_op_lim")
2997 	    .add_see_also("osd_op_queue_mclock_snap_res")
2998 	    .add_see_also("osd_op_queue_mclock_snap_wgt")
2999 	    .add_see_also("osd_op_queue_mclock_recov_res")
3000 	    .add_see_also("osd_op_queue_mclock_recov_wgt")
3001 	    .add_see_also("osd_op_queue_mclock_recov_lim")
3002 	    .add_see_also("osd_op_queue_mclock_scrub_res")
3003 	    .add_see_also("osd_op_queue_mclock_scrub_wgt")
3004 	    .add_see_also("osd_op_queue_mclock_scrub_lim")
3005 	    .add_see_also("osd_op_queue_mclock_anticipation_timeout"),
3006 	
3007 	    Option("osd_op_queue_mclock_recov_res", Option::TYPE_FLOAT, Option::LEVEL_ADVANCED)
3008 	    .set_default(0.0)
3009 	    .set_description("mclock reservation of recovery requests")
3010 	    .set_long_description("mclock reservation of recovery requests when osd_op_queue is either 'mclock_opclass' or 'mclock_client'; higher values increase the reservation")
3011 	    .add_see_also("osd_op_queue")
3012 	    .add_see_also("osd_op_queue_mclock_client_op_res")
3013 	    .add_see_also("osd_op_queue_mclock_client_op_wgt")
3014 	    .add_see_also("osd_op_queue_mclock_client_op_lim")
3015 	    .add_see_also("osd_op_queue_mclock_osd_rep_op_res")
3016 	    .add_see_also("osd_op_queue_mclock_osd_rep_op_wgt")
3017 	    .add_see_also("osd_op_queue_mclock_osd_rep_op_lim")
3018 	    .add_see_also("osd_op_queue_mclock_snap_res")
3019 	    .add_see_also("osd_op_queue_mclock_snap_wgt")
3020 	    .add_see_also("osd_op_queue_mclock_snap_lim")
3021 	    .add_see_also("osd_op_queue_mclock_recov_wgt")
3022 	    .add_see_also("osd_op_queue_mclock_recov_lim")
3023 	    .add_see_also("osd_op_queue_mclock_scrub_res")
3024 	    .add_see_also("osd_op_queue_mclock_scrub_wgt")
3025 	    .add_see_also("osd_op_queue_mclock_scrub_lim")
3026 	    .add_see_also("osd_op_queue_mclock_anticipation_timeout"),
3027 	
3028 	    Option("osd_op_queue_mclock_recov_wgt", Option::TYPE_FLOAT, Option::LEVEL_ADVANCED)
3029 	    .set_default(1.0)
3030 	    .set_description("mclock weight of recovery requests")
3031 	    .set_long_description("mclock weight of recovery requests when osd_op_queue is either 'mclock_opclass' or 'mclock_client'; higher values increase the weight")
3032 	    .add_see_also("osd_op_queue")
3033 	    .add_see_also("osd_op_queue_mclock_client_op_res")
3034 	    .add_see_also("osd_op_queue_mclock_client_op_wgt")
3035 	    .add_see_also("osd_op_queue_mclock_client_op_lim")
3036 	    .add_see_also("osd_op_queue_mclock_osd_rep_op_res")
3037 	    .add_see_also("osd_op_queue_mclock_osd_rep_op_wgt")
3038 	    .add_see_also("osd_op_queue_mclock_osd_rep_op_lim")
3039 	    .add_see_also("osd_op_queue_mclock_snap_res")
3040 	    .add_see_also("osd_op_queue_mclock_snap_wgt")
3041 	    .add_see_also("osd_op_queue_mclock_snap_lim")
3042 	    .add_see_also("osd_op_queue_mclock_recov_res")
3043 	    .add_see_also("osd_op_queue_mclock_recov_lim")
3044 	    .add_see_also("osd_op_queue_mclock_scrub_res")
3045 	    .add_see_also("osd_op_queue_mclock_scrub_wgt")
3046 	    .add_see_also("osd_op_queue_mclock_scrub_lim")
3047 	    .add_see_also("osd_op_queue_mclock_anticipation_timeout"),
3048 	
3049 	    Option("osd_op_queue_mclock_recov_lim", Option::TYPE_FLOAT, Option::LEVEL_ADVANCED)
3050 	    .set_default(0.001)
3051 	    .set_description("mclock limit of recovery requests")
3052 	    .set_long_description("mclock limit of recovery requests when osd_op_queue is either 'mclock_opclass' or 'mclock_client'; higher values increase the limit")
3053 	    .add_see_also("osd_op_queue")
3054 	    .add_see_also("osd_op_queue_mclock_client_op_res")
3055 	    .add_see_also("osd_op_queue_mclock_client_op_wgt")
3056 	    .add_see_also("osd_op_queue_mclock_client_op_lim")
3057 	    .add_see_also("osd_op_queue_mclock_osd_rep_op_res")
3058 	    .add_see_also("osd_op_queue_mclock_osd_rep_op_wgt")
3059 	    .add_see_also("osd_op_queue_mclock_osd_rep_op_lim")
3060 	    .add_see_also("osd_op_queue_mclock_snap_res")
3061 	    .add_see_also("osd_op_queue_mclock_snap_wgt")
3062 	    .add_see_also("osd_op_queue_mclock_snap_lim")
3063 	    .add_see_also("osd_op_queue_mclock_recov_res")
3064 	    .add_see_also("osd_op_queue_mclock_recov_wgt")
3065 	    .add_see_also("osd_op_queue_mclock_scrub_res")
3066 	    .add_see_also("osd_op_queue_mclock_scrub_wgt")
3067 	    .add_see_also("osd_op_queue_mclock_scrub_lim")
3068 	    .add_see_also("osd_op_queue_mclock_anticipation_timeout"),
3069 	
3070 	    Option("osd_op_queue_mclock_scrub_res", Option::TYPE_FLOAT, Option::LEVEL_ADVANCED)
3071 	    .set_default(0.0)
3072 	    .set_description("mclock reservation of scrub requests")
3073 	    .set_long_description("mclock reservation of scrub requests when osd_op_queue is either 'mclock_opclass' or 'mclock_client'; higher values increase the reservation")
3074 	    .add_see_also("osd_op_queue")
3075 	    .add_see_also("osd_op_queue_mclock_client_op_res")
3076 	    .add_see_also("osd_op_queue_mclock_client_op_wgt")
3077 	    .add_see_also("osd_op_queue_mclock_client_op_lim")
3078 	    .add_see_also("osd_op_queue_mclock_osd_rep_op_res")
3079 	    .add_see_also("osd_op_queue_mclock_osd_rep_op_wgt")
3080 	    .add_see_also("osd_op_queue_mclock_osd_rep_op_lim")
3081 	    .add_see_also("osd_op_queue_mclock_snap_res")
3082 	    .add_see_also("osd_op_queue_mclock_snap_wgt")
3083 	    .add_see_also("osd_op_queue_mclock_snap_lim")
3084 	    .add_see_also("osd_op_queue_mclock_recov_res")
3085 	    .add_see_also("osd_op_queue_mclock_recov_wgt")
3086 	    .add_see_also("osd_op_queue_mclock_recov_lim")
3087 	    .add_see_also("osd_op_queue_mclock_scrub_wgt")
3088 	    .add_see_also("osd_op_queue_mclock_scrub_lim")
3089 	    .add_see_also("osd_op_queue_mclock_anticipation_timeout"),
3090 	
3091 	    Option("osd_op_queue_mclock_scrub_wgt", Option::TYPE_FLOAT, Option::LEVEL_ADVANCED)
3092 	    .set_default(1.0)
3093 	    .set_description("mclock weight of scrub requests")
3094 	    .set_long_description("mclock weight of scrub requests when osd_op_queue is either 'mclock_opclass' or 'mclock_client'; higher values increase the weight")
3095 	    .add_see_also("osd_op_queue")
3096 	    .add_see_also("osd_op_queue_mclock_client_op_res")
3097 	    .add_see_also("osd_op_queue_mclock_client_op_wgt")
3098 	    .add_see_also("osd_op_queue_mclock_client_op_lim")
3099 	    .add_see_also("osd_op_queue_mclock_osd_rep_op_res")
3100 	    .add_see_also("osd_op_queue_mclock_osd_rep_op_wgt")
3101 	    .add_see_also("osd_op_queue_mclock_osd_rep_op_lim")
3102 	    .add_see_also("osd_op_queue_mclock_snap_res")
3103 	    .add_see_also("osd_op_queue_mclock_snap_wgt")
3104 	    .add_see_also("osd_op_queue_mclock_snap_lim")
3105 	    .add_see_also("osd_op_queue_mclock_recov_res")
3106 	    .add_see_also("osd_op_queue_mclock_recov_wgt")
3107 	    .add_see_also("osd_op_queue_mclock_recov_lim")
3108 	    .add_see_also("osd_op_queue_mclock_scrub_res")
3109 	    .add_see_also("osd_op_queue_mclock_scrub_lim")
3110 	    .add_see_also("osd_op_queue_mclock_anticipation_timeout"),
3111 	
3112 	    Option("osd_op_queue_mclock_scrub_lim", Option::TYPE_FLOAT, Option::LEVEL_ADVANCED)
3113 	    .set_default(0.001)
3114 	    .set_description("mclock weight of limit requests")
3115 	    .set_long_description("mclock weight of limit requests when osd_op_queue is either 'mclock_opclass' or 'mclock_client'; higher values increase the limit")
3116 	    .add_see_also("osd_op_queue")
3117 	    .add_see_also("osd_op_queue_mclock_client_op_res")
3118 	    .add_see_also("osd_op_queue_mclock_client_op_wgt")
3119 	    .add_see_also("osd_op_queue_mclock_client_op_lim")
3120 	    .add_see_also("osd_op_queue_mclock_osd_rep_op_res")
3121 	    .add_see_also("osd_op_queue_mclock_osd_rep_op_wgt")
3122 	    .add_see_also("osd_op_queue_mclock_osd_rep_op_lim")
3123 	    .add_see_also("osd_op_queue_mclock_snap_res")
3124 	    .add_see_also("osd_op_queue_mclock_snap_wgt")
3125 	    .add_see_also("osd_op_queue_mclock_snap_lim")
3126 	    .add_see_also("osd_op_queue_mclock_recov_res")
3127 	    .add_see_also("osd_op_queue_mclock_recov_wgt")
3128 	    .add_see_also("osd_op_queue_mclock_recov_lim")
3129 	    .add_see_also("osd_op_queue_mclock_scrub_res")
3130 	    .add_see_also("osd_op_queue_mclock_scrub_wgt")
3131 	    .add_see_also("osd_op_queue_mclock_anticipation_timeout"),
3132 	
3133 	    Option("osd_op_queue_mclock_anticipation_timeout", Option::TYPE_FLOAT, Option::LEVEL_ADVANCED)
3134 	    .set_default(0.0)
3135 	    .set_description("mclock anticipation timeout in seconds")
3136 	    .set_long_description("the amount of time that mclock waits until the unused resource is forfeited")
3137 	    .add_see_also("osd_op_queue")
3138 	    .add_see_also("osd_op_queue_mclock_client_op_res")
3139 	    .add_see_also("osd_op_queue_mclock_client_op_wgt")
3140 	    .add_see_also("osd_op_queue_mclock_client_op_lim")
3141 	    .add_see_also("osd_op_queue_mclock_osd_rep_op_res")
3142 	    .add_see_also("osd_op_queue_mclock_osd_rep_op_wgt")
3143 	    .add_see_also("osd_op_queue_mclock_osd_rep_op_lim")
3144 	    .add_see_also("osd_op_queue_mclock_snap_res")
3145 	    .add_see_also("osd_op_queue_mclock_snap_wgt")
3146 	    .add_see_also("osd_op_queue_mclock_snap_lim")
3147 	    .add_see_also("osd_op_queue_mclock_recov_res")
3148 	    .add_see_also("osd_op_queue_mclock_recov_wgt")
3149 	    .add_see_also("osd_op_queue_mclock_recov_lim")
3150 	    .add_see_also("osd_op_queue_mclock_scrub_res")
3151 	    .add_see_also("osd_op_queue_mclock_scrub_wgt")
3152 	    .add_see_also("osd_op_queue_mclock_scrub_lim"),
3153 	
3154 	    Option("osd_op_queue_mclock_pg_delete_res", Option::TYPE_FLOAT, Option::LEVEL_ADVANCED)
3155 	    .set_default(0.0)
3156 	    .set_description("mclock reservation of pg delete work")
3157 	    .set_long_description("mclock reservation of pg delete work when osd_op_queue is either 'mclock_opclass' or 'mclock_client'; higher values increase the reservation")
3158 	    .add_see_also("osd_op_queue")
3159 	    .add_see_also("osd_op_queue_mclock_client_op_res")
3160 	    .add_see_also("osd_op_queue_mclock_client_op_wgt")
3161 	    .add_see_also("osd_op_queue_mclock_client_op_lim")
3162 	    .add_see_also("osd_op_queue_mclock_osd_rep_op_res")
3163 	    .add_see_also("osd_op_queue_mclock_osd_rep_op_wgt")
3164 	    .add_see_also("osd_op_queue_mclock_osd_rep_op_lim")
3165 	    .add_see_also("osd_op_queue_mclock_snap_res")
3166 	    .add_see_also("osd_op_queue_mclock_snap_wgt")
3167 	    .add_see_also("osd_op_queue_mclock_snap_lim")
3168 	    .add_see_also("osd_op_queue_mclock_recov_res")
3169 	    .add_see_also("osd_op_queue_mclock_recov_wgt")
3170 	    .add_see_also("osd_op_queue_mclock_recov_lim")
3171 	    .add_see_also("osd_op_queue_mclock_scrub_wgt")
3172 	    .add_see_also("osd_op_queue_mclock_scrub_lim"),
3173 	
3174 	    Option("osd_op_queue_mclock_pg_delete_wgt", Option::TYPE_FLOAT, Option::LEVEL_ADVANCED)
3175 	    .set_default(1.0)
3176 	    .set_description("mclock weight of pg delete work")
3177 	    .set_long_description("mclock weight of pg delete work when osd_op_queue is either 'mclock_opclass' or 'mclock_client'; higher values increase the weight")
3178 	    .add_see_also("osd_op_queue")
3179 	    .add_see_also("osd_op_queue_mclock_client_op_res")
3180 	    .add_see_also("osd_op_queue_mclock_client_op_wgt")
3181 	    .add_see_also("osd_op_queue_mclock_client_op_lim")
3182 	    .add_see_also("osd_op_queue_mclock_osd_rep_op_res")
3183 	    .add_see_also("osd_op_queue_mclock_osd_rep_op_wgt")
3184 	    .add_see_also("osd_op_queue_mclock_osd_rep_op_lim")
3185 	    .add_see_also("osd_op_queue_mclock_snap_res")
3186 	    .add_see_also("osd_op_queue_mclock_snap_wgt")
3187 	    .add_see_also("osd_op_queue_mclock_snap_lim")
3188 	    .add_see_also("osd_op_queue_mclock_recov_res")
3189 	    .add_see_also("osd_op_queue_mclock_recov_wgt")
3190 	    .add_see_also("osd_op_queue_mclock_recov_lim")
3191 	    .add_see_also("osd_op_queue_mclock_scrub_res")
3192 	    .add_see_also("osd_op_queue_mclock_scrub_lim"),
3193 	
3194 	    Option("osd_op_queue_mclock_pg_delete_lim", Option::TYPE_FLOAT, Option::LEVEL_ADVANCED)
3195 	    .set_default(0.001)
3196 	    .set_description("mclock weight of pg delete work limit requests")
3197 	    .set_long_description("mclock weight of limit pg delete work when osd_op_queue is either 'mclock_opclass' or 'mclock_client'; higher values increase the limit")
3198 	    .add_see_also("osd_op_queue")
3199 	    .add_see_also("osd_op_queue_mclock_client_op_res")
3200 	    .add_see_also("osd_op_queue_mclock_client_op_wgt")
3201 	    .add_see_also("osd_op_queue_mclock_client_op_lim")
3202 	    .add_see_also("osd_op_queue_mclock_osd_rep_op_res")
3203 	    .add_see_also("osd_op_queue_mclock_osd_rep_op_wgt")
3204 	    .add_see_also("osd_op_queue_mclock_osd_rep_op_lim")
3205 	    .add_see_also("osd_op_queue_mclock_snap_res")
3206 	    .add_see_also("osd_op_queue_mclock_snap_wgt")
3207 	    .add_see_also("osd_op_queue_mclock_snap_lim")
3208 	    .add_see_also("osd_op_queue_mclock_recov_res")
3209 	    .add_see_also("osd_op_queue_mclock_recov_wgt")
3210 	    .add_see_also("osd_op_queue_mclock_recov_lim")
3211 	    .add_see_also("osd_op_queue_mclock_scrub_res")
3212 	    .add_see_also("osd_op_queue_mclock_scrub_wgt"),
3213 	
3214 	    Option("osd_op_queue_mclock_peering_event_res", Option::TYPE_FLOAT, Option::LEVEL_ADVANCED)
3215 	    .set_default(0.0)
3216 	    .set_description("mclock reservation of peering events")
3217 	    .set_long_description("mclock reservation of scrub requests when osd_op_queue is either 'mclock_opclass' or 'mclock_client'; higher values increase the reservation")
3218 	    .add_see_also("osd_op_queue")
3219 	    .add_see_also("osd_op_queue_mclock_client_op_res")
3220 	    .add_see_also("osd_op_queue_mclock_client_op_wgt")
3221 	    .add_see_also("osd_op_queue_mclock_client_op_lim")
3222 	    .add_see_also("osd_op_queue_mclock_osd_rep_op_res")
3223 	    .add_see_also("osd_op_queue_mclock_osd_rep_op_wgt")
3224 	    .add_see_also("osd_op_queue_mclock_osd_rep_op_lim")
3225 	    .add_see_also("osd_op_queue_mclock_snap_res")
3226 	    .add_see_also("osd_op_queue_mclock_snap_wgt")
3227 	    .add_see_also("osd_op_queue_mclock_snap_lim")
3228 	    .add_see_also("osd_op_queue_mclock_recov_res")
3229 	    .add_see_also("osd_op_queue_mclock_recov_wgt")
3230 	    .add_see_also("osd_op_queue_mclock_recov_lim")
3231 	    .add_see_also("osd_op_queue_mclock_scrub_wgt")
3232 	    .add_see_also("osd_op_queue_mclock_scrub_lim"),
3233 	
3234 	    Option("osd_op_queue_mclock_peering_event_wgt", Option::TYPE_FLOAT, Option::LEVEL_ADVANCED)
3235 	    .set_default(1.0)
3236 	    .set_description("mclock weight of peering events")
3237 	    .set_long_description("mclock weight of scrub requests when osd_op_queue is either 'mclock_opclass' or 'mclock_client'; higher values increase the weight")
3238 	    .add_see_also("osd_op_queue")
3239 	    .add_see_also("osd_op_queue_mclock_client_op_res")
3240 	    .add_see_also("osd_op_queue_mclock_client_op_wgt")
3241 	    .add_see_also("osd_op_queue_mclock_client_op_lim")
3242 	    .add_see_also("osd_op_queue_mclock_osd_rep_op_res")
3243 	    .add_see_also("osd_op_queue_mclock_osd_rep_op_wgt")
3244 	    .add_see_also("osd_op_queue_mclock_osd_rep_op_lim")
3245 	    .add_see_also("osd_op_queue_mclock_snap_res")
3246 	    .add_see_also("osd_op_queue_mclock_snap_wgt")
3247 	    .add_see_also("osd_op_queue_mclock_snap_lim")
3248 	    .add_see_also("osd_op_queue_mclock_recov_res")
3249 	    .add_see_also("osd_op_queue_mclock_recov_wgt")
3250 	    .add_see_also("osd_op_queue_mclock_recov_lim")
3251 	    .add_see_also("osd_op_queue_mclock_scrub_res")
3252 	    .add_see_also("osd_op_queue_mclock_scrub_lim"),
3253 	
3254 	    Option("osd_op_queue_mclock_peering_event_lim", Option::TYPE_FLOAT, Option::LEVEL_ADVANCED)
3255 	    .set_default(0.001)
3256 	    .set_description("mclock weight of limit peering events")
3257 	    .set_long_description("mclock weight of limit requests when osd_op_queue is either 'mclock_opclass' or 'mclock_client'; higher values increase the limit")
3258 	    .add_see_also("osd_op_queue")
3259 	    .add_see_also("osd_op_queue_mclock_client_op_res")
3260 	    .add_see_also("osd_op_queue_mclock_client_op_wgt")
3261 	    .add_see_also("osd_op_queue_mclock_client_op_lim")
3262 	    .add_see_also("osd_op_queue_mclock_osd_rep_op_res")
3263 	    .add_see_also("osd_op_queue_mclock_osd_rep_op_wgt")
3264 	    .add_see_also("osd_op_queue_mclock_osd_rep_op_lim")
3265 	    .add_see_also("osd_op_queue_mclock_snap_res")
3266 	    .add_see_also("osd_op_queue_mclock_snap_wgt")
3267 	    .add_see_also("osd_op_queue_mclock_snap_lim")
3268 	    .add_see_also("osd_op_queue_mclock_recov_res")
3269 	    .add_see_also("osd_op_queue_mclock_recov_wgt")
3270 	    .add_see_also("osd_op_queue_mclock_recov_lim")
3271 	    .add_see_also("osd_op_queue_mclock_scrub_res")
3272 	    .add_see_also("osd_op_queue_mclock_scrub_wgt"),
3273 	
3274 	    Option("osd_ignore_stale_divergent_priors", Option::TYPE_BOOL, Option::LEVEL_ADVANCED)
3275 	    .set_default(false)
3276 	    .set_description(""),
3277 	
3278 	    Option("osd_read_ec_check_for_errors", Option::TYPE_BOOL, Option::LEVEL_ADVANCED)
3279 	    .set_default(false)
3280 	    .set_description(""),
3281 	
3282 	    Option("osd_recover_clone_overlap_limit", Option::TYPE_INT, Option::LEVEL_ADVANCED)
3283 	    .set_default(10)
3284 	    .set_description(""),
3285 	
3286 	    Option("osd_debug_feed_pullee", Option::TYPE_INT, Option::LEVEL_DEV)
3287 	    .set_default(-1)
3288 	    .set_description("Feed a pullee, and force primary to pull "
3289 	                     "a currently missing object from it"),
3290 	
3291 	    Option("osd_backfill_scan_min", Option::TYPE_INT, Option::LEVEL_ADVANCED)
3292 	    .set_default(64)
3293 	    .set_description(""),
3294 	
3295 	    Option("osd_backfill_scan_max", Option::TYPE_INT, Option::LEVEL_ADVANCED)
3296 	    .set_default(512)
3297 	    .set_description(""),
3298 	
3299 	    Option("osd_op_thread_timeout", Option::TYPE_INT, Option::LEVEL_ADVANCED)
3300 	    .set_default(15)
3301 	    .set_description(""),
3302 	
3303 	    Option("osd_op_thread_suicide_timeout", Option::TYPE_INT, Option::LEVEL_ADVANCED)
3304 	    .set_default(150)
3305 	    .set_description(""),
3306 	
3307 	    Option("osd_recovery_sleep", Option::TYPE_FLOAT, Option::LEVEL_ADVANCED)
3308 	    .set_default(0)
3309 	    .set_description("Time in seconds to sleep before next recovery or backfill op"),
3310 	
3311 	    Option("osd_recovery_sleep_hdd", Option::TYPE_FLOAT, Option::LEVEL_ADVANCED)
3312 	    .set_default(0.1)
3313 	    .set_description("Time in seconds to sleep before next recovery or backfill op for HDDs"),
3314 	
3315 	    Option("osd_recovery_sleep_ssd", Option::TYPE_FLOAT, Option::LEVEL_ADVANCED)
3316 	    .set_default(0)
3317 	    .set_description("Time in seconds to sleep before next recovery or backfill op for SSDs")
3318 	    .add_see_also("osd_recovery_sleep"),
3319 	
3320 	    Option("osd_recovery_sleep_hybrid", Option::TYPE_FLOAT, Option::LEVEL_ADVANCED)
3321 	    .set_default(0.025)
3322 	    .set_description("Time in seconds to sleep before next recovery or backfill op when data is on HDD and journal is on SSD")
3323 	    .add_see_also("osd_recovery_sleep"),
3324 	
3325 	    Option("osd_snap_trim_sleep", Option::TYPE_FLOAT, Option::LEVEL_ADVANCED)
3326 	    .set_default(0)
3327 	    .set_description("Time in seconds to sleep before next snap trim (overrides values below)"),
3328 	
3329 	    Option("osd_snap_trim_sleep_hdd", Option::TYPE_FLOAT, Option::LEVEL_ADVANCED)
3330 	    .set_default(5)
3331 	    .set_description("Time in seconds to sleep before next snap trim for HDDs"),
3332 	
3333 	    Option("osd_snap_trim_sleep_ssd", Option::TYPE_FLOAT, Option::LEVEL_ADVANCED)
3334 	    .set_default(0)
3335 	    .set_description("Time in seconds to sleep before next snap trim for SSDs"),
3336 	
3337 	    Option("osd_snap_trim_sleep_hybrid", Option::TYPE_FLOAT, Option::LEVEL_ADVANCED)
3338 	    .set_default(2)
3339 	    .set_description("Time in seconds to sleep before next snap trim when data is on HDD and journal is on SSD"),
3340 	
3341 	    Option("osd_scrub_invalid_stats", Option::TYPE_BOOL, Option::LEVEL_ADVANCED)
3342 	    .set_default(true)
3343 	    .set_description(""),
3344 	
3345 	    Option("osd_command_thread_timeout", Option::TYPE_INT, Option::LEVEL_ADVANCED)
3346 	    .set_default(10_min)
3347 	    .set_description(""),
3348 	
3349 	    Option("osd_command_thread_suicide_timeout", Option::TYPE_INT, Option::LEVEL_ADVANCED)
3350 	    .set_default(15_min)
3351 	    .set_description(""),
3352 	
3353 	    Option("osd_heartbeat_interval", Option::TYPE_INT, Option::LEVEL_DEV)
3354 	    .set_default(6)
3355 	    .set_min_max(1, 60)
3356 	    .set_description("Interval (in seconds) between peer pings"),
3357 	
3358 	    Option("osd_heartbeat_grace", Option::TYPE_INT, Option::LEVEL_ADVANCED)
3359 	    .set_default(20)
3360 	    .set_description(""),
3361 	
3362 	    Option("osd_heartbeat_stale", Option::TYPE_INT, Option::LEVEL_ADVANCED)
3363 	    .set_default(600)
3364 	    .set_description("Interval (in seconds) we mark an unresponsive heartbeat peer as stale.")
3365 	    .set_long_description("Automatically mark unresponsive heartbeat sessions as stale and tear them down. "
3366 			          "The primary benefit is that OSD doesn't need to keep a flood of "
3367 				  "blocked heartbeat messages around in memory."),
3368 	
3369 	    Option("osd_heartbeat_min_peers", Option::TYPE_INT, Option::LEVEL_ADVANCED)
3370 	    .set_default(10)
3371 	    .set_description(""),
3372 	
3373 	    Option("osd_heartbeat_use_min_delay_socket", Option::TYPE_BOOL, Option::LEVEL_ADVANCED)
3374 	    .set_default(false)
3375 	    .set_description(""),
3376 	
3377 	    Option("osd_heartbeat_min_size", Option::TYPE_SIZE, Option::LEVEL_ADVANCED)
3378 	    .set_default(2000)
3379 	    .set_description("Minimum heartbeat packet size in bytes. Will add dummy payload if heartbeat packet is smaller than this."),
3380 	
3381 	    Option("osd_pg_max_concurrent_snap_trims", Option::TYPE_UINT, Option::LEVEL_ADVANCED)
3382 	    .set_default(2)
3383 	    .set_description(""),
3384 	
3385 	    Option("osd_max_trimming_pgs", Option::TYPE_UINT, Option::LEVEL_ADVANCED)
3386 	    .set_default(2)
3387 	    .set_description(""),
3388 	
3389 	    Option("osd_heartbeat_min_healthy_ratio", Option::TYPE_FLOAT, Option::LEVEL_ADVANCED)
3390 	    .set_default(.33)
3391 	    .set_description(""),
3392 	
3393 	    Option("osd_mon_heartbeat_interval", Option::TYPE_INT, Option::LEVEL_ADVANCED)
3394 	    .set_default(30)
3395 	    .set_description(""),
3396 	
3397 	    Option("osd_mon_heartbeat_stat_stale", Option::TYPE_INT, Option::LEVEL_ADVANCED)
3398 	    .set_default(1_hr)
3399 	    .set_description("Stop reporting on heartbeat ping times not updated for this many seconds.")
3400 	    .set_long_description("Stop reporting on old heartbeat information unless this is set to zero"),
3401 	
3402 	    Option("osd_mon_report_interval", Option::TYPE_INT, Option::LEVEL_ADVANCED)
3403 	    .set_default(5)
3404 	    .set_description("Frequency of OSD reports to mon for peer failures, fullness status changes"),
3405 	
3406 	    Option("osd_mon_report_max_in_flight", Option::TYPE_INT, Option::LEVEL_ADVANCED)
3407 	    .set_default(2)
3408 	    .set_description(""),
3409 	
3410 	    Option("osd_beacon_report_interval", Option::TYPE_INT, Option::LEVEL_ADVANCED)
3411 	    .set_default(300)
3412 	    .set_description(""),
3413 	
3414 	    Option("osd_pg_stat_report_interval_max", Option::TYPE_INT, Option::LEVEL_ADVANCED)
3415 	    .set_default(500)
3416 	    .set_description(""),
3417 	
3418 	    Option("osd_mon_ack_timeout", Option::TYPE_FLOAT, Option::LEVEL_ADVANCED)
3419 	    .set_default(30.0)
3420 	    .set_description(""),
3421 	
3422 	    Option("osd_stats_ack_timeout_factor", Option::TYPE_FLOAT, Option::LEVEL_ADVANCED)
3423 	    .set_default(2.0)
3424 	    .set_description(""),
3425 	
3426 	    Option("osd_stats_ack_timeout_decay", Option::TYPE_FLOAT, Option::LEVEL_ADVANCED)
3427 	    .set_default(.9)
3428 	    .set_description(""),
3429 	
3430 	    Option("osd_max_snap_prune_intervals_per_epoch", Option::TYPE_UINT, Option::LEVEL_DEV)
3431 	    .set_default(512)
3432 	    .set_description("Max number of snap intervals to report to mgr in pg_stat_t"),
3433 	
3434 	    Option("osd_default_data_pool_replay_window", Option::TYPE_INT, Option::LEVEL_ADVANCED)
3435 	    .set_default(45)
3436 	    .set_description(""),
3437 	
3438 	    Option("osd_auto_mark_unfound_lost", Option::TYPE_BOOL, Option::LEVEL_ADVANCED)
3439 	    .set_default(false)
3440 	    .set_description(""),
3441 	
3442 	    Option("osd_recovery_delay_start", Option::TYPE_FLOAT, Option::LEVEL_ADVANCED)
3443 	    .set_default(0)
3444 	    .set_description(""),
3445 	
3446 	    Option("osd_recovery_max_active", Option::TYPE_UINT, Option::LEVEL_ADVANCED)
3447 	    .set_default(0)
3448 	    .set_description("Number of simultaneous active recovery operations per OSD (overrides _ssd and _hdd if non-zero)")
3449 	    .add_see_also("osd_recovery_max_active_hdd")
3450 	    .add_see_also("osd_recovery_max_active_ssd"),
3451 	
3452 	    Option("osd_recovery_max_active_hdd", Option::TYPE_UINT, Option::LEVEL_ADVANCED)
3453 	    .set_default(3)
3454 	    .set_description("Number of simultaneous active recovery oeprations per OSD (for rotational devices)")
3455 	    .add_see_also("osd_recovery_max_active")
3456 	    .add_see_also("osd_recovery_max_active_ssd"),
3457 	
3458 	    Option("osd_recovery_max_active_ssd", Option::TYPE_UINT, Option::LEVEL_ADVANCED)
3459 	    .set_default(10)
3460 	    .set_description("Number of simultaneous active recovery oeprations per OSD (for non-rotational solid state devices)")
3461 	    .add_see_also("osd_recovery_max_active")
3462 	    .add_see_also("osd_recovery_max_active_hdd"),
3463 	
3464 	    Option("osd_recovery_max_single_start", Option::TYPE_UINT, Option::LEVEL_ADVANCED)
3465 	    .set_default(1)
3466 	    .set_description(""),
3467 	
3468 	    Option("osd_recovery_max_chunk", Option::TYPE_SIZE, Option::LEVEL_ADVANCED)
3469 	    .set_default(8_M)
3470 	    .set_description(""),
3471 	
3472 	    Option("osd_recovery_max_omap_entries_per_chunk", Option::TYPE_UINT, Option::LEVEL_ADVANCED)
3473 	    .set_default(8096)
3474 	    .set_description(""),
3475 	
3476 	    Option("osd_copyfrom_max_chunk", Option::TYPE_SIZE, Option::LEVEL_ADVANCED)
3477 	    .set_default(8_M)
3478 	    .set_description(""),
3479 	
3480 	    Option("osd_push_per_object_cost", Option::TYPE_SIZE, Option::LEVEL_ADVANCED)
3481 	    .set_default(1000)
3482 	    .set_description(""),
3483 	
3484 	    Option("osd_max_push_cost", Option::TYPE_SIZE, Option::LEVEL_ADVANCED)
3485 	    .set_default(8<<20)
3486 	    .set_description(""),
3487 	
3488 	    Option("osd_max_push_objects", Option::TYPE_UINT, Option::LEVEL_ADVANCED)
3489 	    .set_default(10)
3490 	    .set_description(""),
3491 	
3492 	    Option("osd_max_scrubs", Option::TYPE_INT, Option::LEVEL_ADVANCED)
3493 	    .set_default(1)
3494 	    .set_description("Maximum concurrent scrubs on a single OSD"),
3495 	
3496 	    Option("osd_scrub_during_recovery", Option::TYPE_BOOL, Option::LEVEL_ADVANCED)
3497 	    .set_default(false)
3498 	    .set_description("Allow scrubbing when PGs on the OSD are undergoing recovery"),
3499 	
3500 	    Option("osd_repair_during_recovery", Option::TYPE_BOOL, Option::LEVEL_ADVANCED)
3501 	    .set_default(false)
3502 	    .set_description("Allow requested repairing when PGs on the OSD are undergoing recovery"),
3503 	
3504 	    Option("osd_scrub_begin_hour", Option::TYPE_INT, Option::LEVEL_ADVANCED)
3505 	    .set_default(0)
3506 	    .set_description("Restrict scrubbing to this hour of the day or later")
3507 	    .add_see_also("osd_scrub_end_hour"),
3508 	
3509 	    Option("osd_scrub_end_hour", Option::TYPE_INT, Option::LEVEL_ADVANCED)
3510 	    .set_default(24)
3511 	    .set_description("Restrict scrubbing to hours of the day earlier than this")
3512 	    .add_see_also("osd_scrub_begin_hour"),
3513 	
3514 	    Option("osd_scrub_begin_week_day", Option::TYPE_INT, Option::LEVEL_ADVANCED)
3515 	    .set_default(0)
3516 	    .set_description("Restrict scrubbing to this day of the week or later")
3517 	    .set_long_description("0 or 7 = Sunday, 1 = Monday, etc.")
3518 	    .add_see_also("osd_scrub_end_week_day"),
3519 	
3520 	    Option("osd_scrub_end_week_day", Option::TYPE_INT, Option::LEVEL_ADVANCED)
3521 	    .set_default(7)
3522 	    .set_description("Restrict scrubbing to days of the week earlier than this")
3523 	    .set_long_description("0 or 7 = Sunday, 1 = Monday, etc.")
3524 	    .add_see_also("osd_scrub_begin_week_day"),
3525 	
3526 	    Option("osd_scrub_load_threshold", Option::TYPE_FLOAT, Option::LEVEL_ADVANCED)
3527 	    .set_default(0.5)
3528 	    .set_description("Allow scrubbing when system load divided by number of CPUs is below this value"),
3529 	
3530 	    Option("osd_scrub_min_interval", Option::TYPE_FLOAT, Option::LEVEL_ADVANCED)
3531 	    .set_default(1_day)
3532 	    .set_description("Scrub each PG no more often than this interval")
3533 	    .add_see_also("osd_scrub_max_interval"),
3534 	
3535 	    Option("osd_scrub_max_interval", Option::TYPE_FLOAT, Option::LEVEL_ADVANCED)
3536 	    .set_default(7_day)
3537 	    .set_description("Scrub each PG no less often than this interval")
3538 	    .add_see_also("osd_scrub_min_interval"),
3539 	
3540 	    Option("osd_scrub_interval_randomize_ratio", Option::TYPE_FLOAT, Option::LEVEL_ADVANCED)
3541 	    .set_default(0.5)
3542 	    .set_description("Ratio of scrub interval to randomly vary")
3543 	    .set_long_description("This prevents a scrub 'stampede' by randomly varying the scrub intervals so that they are soon uniformly distributed over the week")
3544 	    .add_see_also("osd_scrub_min_interval"),
3545 	
3546 	    Option("osd_scrub_backoff_ratio", Option::TYPE_FLOAT, Option::LEVEL_DEV)
3547 	    .set_default(.66)
3548 	    .set_long_description("This is the precentage of ticks that do NOT schedule scrubs, 66% means that 1 out of 3 ticks will schedule scrubs")
3549 	    .set_description("Backoff ratio for scheduling scrubs"),
3550 	
3551 	    Option("osd_scrub_chunk_min", Option::TYPE_INT, Option::LEVEL_ADVANCED)
3552 	    .set_default(5)
3553 	    .set_description("Minimum number of objects to scrub in a single chunk")
3554 	    .add_see_also("osd_scrub_chunk_max"),
3555 	
3556 	    Option("osd_scrub_chunk_max", Option::TYPE_INT, Option::LEVEL_ADVANCED)
3557 	    .set_default(25)
3558 	    .set_description("Maximum number of objects to scrub in a single chunk")
3559 	    .add_see_also("osd_scrub_chunk_min"),
3560 	
3561 	    Option("osd_scrub_sleep", Option::TYPE_FLOAT, Option::LEVEL_ADVANCED)
3562 	    .set_default(0)
3563 	    .set_description("Duration to inject a delay during scrubbing"),
3564 	
3565 	    Option("osd_scrub_extended_sleep", Option::TYPE_FLOAT, Option::LEVEL_ADVANCED)
3566 	    .set_default(0)
3567 	    .set_description("Duration to inject a delay during scrubbing out of scrubbing hours")
3568 	    .add_see_also("osd_scrub_begin_hour")
3569 	    .add_see_also("osd_scrub_end_hour")
3570 	    .add_see_also("osd_scrub_begin_week_day")
3571 	    .add_see_also("osd_scrub_end_week_day"),
3572 	
3573 	    Option("osd_scrub_auto_repair", Option::TYPE_BOOL, Option::LEVEL_ADVANCED)
3574 	    .set_default(false)
3575 	    .set_description("Automatically repair damaged objects detected during scrub"),
3576 	
3577 	    Option("osd_scrub_auto_repair_num_errors", Option::TYPE_UINT, Option::LEVEL_ADVANCED)
3578 	    .set_default(5)
3579 	    .set_description("Maximum number of detected errors to automatically repair")
3580 	    .add_see_also("osd_scrub_auto_repair"),
3581 	
3582 	    Option("osd_scrub_max_preemptions", Option::TYPE_UINT, Option::LEVEL_ADVANCED)
3583 	    .set_default(5)
3584 	    .set_description("Set the maximum number of times we will preempt a deep scrub due to a client operation before blocking client IO to complete the scrub"),
3585 	
3586 	    Option("osd_deep_scrub_interval", Option::TYPE_FLOAT, Option::LEVEL_ADVANCED)
3587 	    .set_default(7_day)
3588 	    .set_description("Deep scrub each PG (i.e., verify data checksums) at least this often"),
3589 	
3590 	    Option("osd_deep_scrub_randomize_ratio", Option::TYPE_FLOAT, Option::LEVEL_ADVANCED)
3591 	    .set_default(0.15)
3592 	    .set_description("Scrubs will randomly become deep scrubs at this rate (0.15 -> 15% of scrubs are deep)")
3593 	    .set_long_description("This prevents a deep scrub 'stampede' by spreading deep scrubs so they are uniformly distributed over the week"),
3594 	
3595 	    Option("osd_deep_scrub_stride", Option::TYPE_SIZE, Option::LEVEL_ADVANCED)
3596 	    .set_default(512_K)
3597 	    .set_description("Number of bytes to read from an object at a time during deep scrub"),
3598 	
3599 	    Option("osd_deep_scrub_keys", Option::TYPE_INT, Option::LEVEL_ADVANCED)
3600 	    .set_default(1024)
3601 	    .set_description("Number of keys to read from an object at a time during deep scrub"),
3602 	
3603 	    Option("osd_deep_scrub_update_digest_min_age", Option::TYPE_INT, Option::LEVEL_ADVANCED)
3604 	    .set_default(2_hr)
3605 	    .set_description("Update overall object digest only if object was last modified longer ago than this"),
3606 	
3607 	    Option("osd_deep_scrub_large_omap_object_key_threshold", Option::TYPE_UINT, Option::LEVEL_ADVANCED)
3608 	    .set_default(200000)
3609 	    .set_description("Warn when we encounter an object with more omap keys than this")
3610 	    .add_service("osd")
3611 	    .add_see_also("osd_deep_scrub_large_omap_object_value_sum_threshold"),
3612 	
3613 	    Option("osd_deep_scrub_large_omap_object_value_sum_threshold", Option::TYPE_SIZE, Option::LEVEL_ADVANCED)
3614 	    .set_default(1_G)
3615 	    .set_description("Warn when we encounter an object with more omap key bytes than this")
3616 	    .add_service("osd")
3617 	    .add_see_also("osd_deep_scrub_large_omap_object_key_threshold"),
3618 	
3619 	    Option("osd_class_dir", Option::TYPE_STR, Option::LEVEL_ADVANCED)
3620 	    .set_default(CEPH_LIBDIR "/rados-classes")
3621 	    .set_description(""),
3622 	
3623 	    Option("osd_open_classes_on_start", Option::TYPE_BOOL, Option::LEVEL_ADVANCED)
3624 	    .set_default(true)
3625 	    .set_description(""),
3626 	
3627 	    Option("osd_class_load_list", Option::TYPE_STR, Option::LEVEL_ADVANCED)
3628 	    .set_default("cephfs hello journal lock log numops " "otp rbd refcount rgw timeindex user version cas")
3629 	    .set_description(""),
3630 	
3631 	    Option("osd_class_default_list", Option::TYPE_STR, Option::LEVEL_ADVANCED)
3632 	    .set_default("cephfs hello journal lock log numops " "otp rbd refcount rgw timeindex user version cas")
3633 	    .set_description(""),
3634 	
3635 	    Option("osd_check_for_log_corruption", Option::TYPE_BOOL, Option::LEVEL_ADVANCED)
3636 	    .set_default(false)
3637 	    .set_description(""),
3638 	
3639 	    Option("osd_use_stale_snap", Option::TYPE_BOOL, Option::LEVEL_ADVANCED)
3640 	    .set_default(false)
3641 	    .set_description(""),
3642 	
3643 	    Option("osd_rollback_to_cluster_snap", Option::TYPE_STR, Option::LEVEL_ADVANCED)
3644 	    .set_default("")
3645 	    .set_description(""),
3646 	
3647 	    Option("osd_default_notify_timeout", Option::TYPE_UINT, Option::LEVEL_ADVANCED)
3648 	    .set_default(30)
3649 	    .set_description(""),
3650 	
3651 	    Option("osd_kill_backfill_at", Option::TYPE_INT, Option::LEVEL_DEV)
3652 	    .set_default(0)
3653 	    .set_description(""),
3654 	
3655 	    Option("osd_pg_epoch_persisted_max_stale", Option::TYPE_UINT, Option::LEVEL_ADVANCED)
3656 	    .set_default(40)
3657 	    .set_description(""),
3658 	
3659 	    Option("osd_min_pg_log_entries", Option::TYPE_UINT, Option::LEVEL_ADVANCED)
3660 	    .set_default(3000)
3661 	    .set_description("minimum number of entries to maintain in the PG log")
3662 	    .add_service("osd")
3663 	    .add_see_also("osd_max_pg_log_entries")
3664 	    .add_see_also("osd_pg_log_dups_tracked"),
3665 	
3666 	    Option("osd_max_pg_log_entries", Option::TYPE_UINT, Option::LEVEL_ADVANCED)
3667 	    .set_default(3000)
3668 	    .set_description("maximum number of entries to maintain in the PG log when degraded before we trim")
3669 	    .add_service("osd")
3670 	    .add_see_also("osd_min_pg_log_entries")
3671 	    .add_see_also("osd_pg_log_dups_tracked"),
3672 	
3673 	    Option("osd_pg_log_dups_tracked", Option::TYPE_UINT, Option::LEVEL_ADVANCED)
3674 	    .set_default(3000)
3675 	    .set_description("how many versions back to track in order to detect duplicate ops; this is combined with both the regular pg log entries and additional minimal dup detection entries")
3676 	    .add_service("osd")
3677 	    .add_see_also("osd_min_pg_log_entries")
3678 	    .add_see_also("osd_max_pg_log_entries"),
3679 	
3680 	    Option("osd_object_clean_region_max_num_intervals", Option::TYPE_INT, Option::LEVEL_ADVANCED)
3681 	    .set_default(10)
3682 	    .set_description("number of intervals in clean_offsets")
3683 	    .set_long_description("partial recovery uses multiple intervals to record the clean part of the object"
3684 	        "when the number of intervals is greater than osd_object_clean_region_max_num_intervals, minimum interval will be trimmed"
3685 	        "(0 will recovery the entire object data interval)")
3686 	    .add_service("osd"),
3687 	
3688 	    Option("osd_force_recovery_pg_log_entries_factor", Option::TYPE_FLOAT, Option::LEVEL_ADVANCED)
3689 	    .set_default(1.3)
3690 	    .set_description(""),
3691 	
3692 	    Option("osd_pg_log_trim_min", Option::TYPE_UINT, Option::LEVEL_ADVANCED)
3693 	    .set_default(100)
3694 	    .set_description(""),
3695 	
3696 	    Option("osd_force_auth_primary_missing_objects", Option::TYPE_UINT, Option::LEVEL_ADVANCED)
3697 	    .set_default(100)
3698 	    .set_description("Approximate missing objects above which to force auth_log_shard to be primary temporarily"),
3699 	
3700 	    Option("osd_async_recovery_min_cost", Option::TYPE_UINT, Option::LEVEL_ADVANCED)
3701 	    .set_default(100)
3702 	    .set_description("A mixture measure of number of current log entries difference "
3703 	                     "and historical missing objects,  above which we switch to use "
3704 	                     "asynchronous recovery when appropriate"),
3705 	
3706 	    Option("osd_max_pg_per_osd_hard_ratio", Option::TYPE_FLOAT, Option::LEVEL_ADVANCED)
3707 	    .set_default(3)
3708 	    .set_min(1)
3709 	    .set_description("Maximum number of PG per OSD, a factor of 'mon_max_pg_per_osd'")
3710 	    .set_long_description("OSD will refuse to instantiate PG if the number of PG it serves exceeds this number.")
3711 	    .add_see_also("mon_max_pg_per_osd"),
3712 	
3713 	    Option("osd_pg_log_trim_max", Option::TYPE_UINT, Option::LEVEL_ADVANCED)
3714 	    .set_default(10000)
3715 	    .set_description("maximum number of entries to remove at once from the PG log")
3716 	    .add_service("osd")
3717 	    .add_see_also("osd_min_pg_log_entries")
3718 	    .add_see_also("osd_max_pg_log_entries"),
3719 	
3720 	    Option("osd_op_complaint_time", Option::TYPE_FLOAT, Option::LEVEL_ADVANCED)
3721 	    .set_default(30)
3722 	    .set_description(""),
3723 	
3724 	    Option("osd_command_max_records", Option::TYPE_INT, Option::LEVEL_ADVANCED)
3725 	    .set_default(256)
3726 	    .set_description(""),
3727 	
3728 	    Option("osd_max_pg_blocked_by", Option::TYPE_UINT, Option::LEVEL_ADVANCED)
3729 	    .set_default(16)
3730 	    .set_description(""),
3731 	
3732 	    Option("osd_op_log_threshold", Option::TYPE_INT, Option::LEVEL_ADVANCED)
3733 	    .set_default(5)
3734 	    .set_description(""),
3735 	
3736 	    Option("osd_backoff_on_unfound", Option::TYPE_BOOL, Option::LEVEL_ADVANCED)
3737 	    .set_default(true)
3738 	    .set_description(""),
3739 	
3740 	    Option("osd_backoff_on_degraded", Option::TYPE_BOOL, Option::LEVEL_ADVANCED)
3741 	    .set_default(false)
3742 	    .set_description(""),
3743 	
3744 	    Option("osd_backoff_on_peering", Option::TYPE_BOOL, Option::LEVEL_ADVANCED)
3745 	    .set_default(false)
3746 	    .set_description(""),
3747 	
3748 	    Option("osd_debug_shutdown", Option::TYPE_BOOL, Option::LEVEL_DEV)
3749 	    .set_default(false)
3750 	    .set_description("Turn up debug levels during shutdown"),
3751 	
3752 	    Option("osd_debug_crash_on_ignored_backoff", Option::TYPE_BOOL, Option::LEVEL_DEV)
3753 	    .set_default(false)
3754 	    .set_description(""),
3755 	
3756 	    Option("osd_debug_inject_dispatch_delay_probability", Option::TYPE_FLOAT, Option::LEVEL_DEV)
3757 	    .set_default(0)
3758 	    .set_description(""),
3759 	
3760 	    Option("osd_debug_inject_dispatch_delay_duration", Option::TYPE_FLOAT, Option::LEVEL_DEV)
3761 	    .set_default(.1)
3762 	    .set_description(""),
3763 	
3764 	    Option("osd_debug_drop_ping_probability", Option::TYPE_FLOAT, Option::LEVEL_DEV)
3765 	    .set_default(0)
3766 	    .set_description(""),
3767 	
3768 	    Option("osd_debug_drop_ping_duration", Option::TYPE_INT, Option::LEVEL_DEV)
3769 	    .set_default(0)
3770 	    .set_description(""),
3771 	
3772 	    Option("osd_debug_op_order", Option::TYPE_BOOL, Option::LEVEL_DEV)
3773 	    .set_default(false)
3774 	    .set_description(""),
3775 	
3776 	    Option("osd_debug_verify_missing_on_start", Option::TYPE_BOOL, Option::LEVEL_DEV)
3777 	    .set_default(false)
3778 	    .set_description(""),
3779 	
3780 	    Option("osd_debug_verify_snaps", Option::TYPE_BOOL, Option::LEVEL_DEV)
3781 	    .set_default(false)
3782 	    .set_description(""),
3783 	
3784 	    Option("osd_debug_verify_stray_on_activate", Option::TYPE_BOOL, Option::LEVEL_DEV)
3785 	    .set_default(false)
3786 	    .set_description(""),
3787 	
3788 	    Option("osd_debug_skip_full_check_in_backfill_reservation", Option::TYPE_BOOL, Option::LEVEL_DEV)
3789 	    .set_default(false)
3790 	    .set_description(""),
3791 	
3792 	    Option("osd_debug_reject_backfill_probability", Option::TYPE_FLOAT, Option::LEVEL_DEV)
3793 	    .set_default(0)
3794 	    .set_description(""),
3795 	
3796 	    Option("osd_debug_inject_copyfrom_error", Option::TYPE_BOOL, Option::LEVEL_DEV)
3797 	    .set_default(false)
3798 	    .set_description(""),
3799 	
3800 	    Option("osd_debug_misdirected_ops", Option::TYPE_BOOL, Option::LEVEL_DEV)
3801 	    .set_default(false)
3802 	    .set_description(""),
3803 	
3804 	    Option("osd_debug_skip_full_check_in_recovery", Option::TYPE_BOOL, Option::LEVEL_DEV)
3805 	    .set_default(false)
3806 	    .set_description(""),
3807 	
3808 	    Option("osd_debug_random_push_read_error", Option::TYPE_FLOAT, Option::LEVEL_DEV)
3809 	    .set_default(0)
3810 	    .set_description(""),
3811 	
3812 	    Option("osd_debug_verify_cached_snaps", Option::TYPE_BOOL, Option::LEVEL_DEV)
3813 	    .set_default(false)
3814 	    .set_description(""),
3815 	
3816 	    Option("osd_debug_deep_scrub_sleep", Option::TYPE_FLOAT, Option::LEVEL_DEV)
3817 	    .set_default(0)
3818 	    .set_description("Inject an expensive sleep during deep scrub IO to make it easier to induce preemption"),
3819 	
3820 	    Option("osd_debug_no_acting_change", Option::TYPE_BOOL, Option::LEVEL_DEV)
3821 	    .set_default(false),
3822 	    Option("osd_debug_no_purge_strays", Option::TYPE_BOOL, Option::LEVEL_DEV)
3823 	    .set_default(false),
3824 	
3825 	    Option("osd_debug_pretend_recovery_active", Option::TYPE_BOOL, Option::LEVEL_DEV)
3826 	    .set_default(false)
3827 	    .set_description(""),
3828 	
3829 	    Option("osd_enable_op_tracker", Option::TYPE_BOOL, Option::LEVEL_ADVANCED)
3830 	    .set_default(true)
3831 	    .set_description(""),
3832 	
3833 	    Option("osd_num_op_tracker_shard", Option::TYPE_UINT, Option::LEVEL_ADVANCED)
3834 	    .set_default(32)
3835 	    .set_description(""),
3836 	
3837 	    Option("osd_op_history_size", Option::TYPE_UINT, Option::LEVEL_ADVANCED)
3838 	    .set_default(20)
3839 	    .set_description(""),
3840 	
3841 	    Option("osd_op_history_duration", Option::TYPE_UINT, Option::LEVEL_ADVANCED)
3842 	    .set_default(600)
3843 	    .set_description(""),
3844 	
3845 	    Option("osd_op_history_slow_op_size", Option::TYPE_UINT, Option::LEVEL_ADVANCED)
3846 	    .set_default(20)
3847 	    .set_description(""),
3848 	
3849 	    Option("osd_op_history_slow_op_threshold", Option::TYPE_FLOAT, Option::LEVEL_ADVANCED)
3850 	    .set_default(10.0)
3851 	    .set_description(""),
3852 	
3853 	    Option("osd_target_transaction_size", Option::TYPE_INT, Option::LEVEL_ADVANCED)
3854 	    .set_default(30)
3855 	    .set_description(""),
3856 	
3857 	    Option("osd_delete_sleep", Option::TYPE_FLOAT, Option::LEVEL_ADVANCED)
3858 	    .set_default(0)
3859 	    .set_description("Time in seconds to sleep before next removal transaction (overrides values below)"),
3860 	
3861 	    Option("osd_delete_sleep_hdd", Option::TYPE_FLOAT, Option::LEVEL_ADVANCED)
3862 	    .set_default(5)
3863 	    .set_description("Time in seconds to sleep before next removal transaction for HDDs"),
3864 	
3865 	    Option("osd_delete_sleep_ssd", Option::TYPE_FLOAT, Option::LEVEL_ADVANCED)
3866 	    .set_default(0)
3867 	    .set_description("Time in seconds to sleep before next removal transaction for SSDs"),
3868 	
3869 	    Option("osd_delete_sleep_hybrid", Option::TYPE_FLOAT, Option::LEVEL_ADVANCED)
3870 	    .set_default(2)
3871 	    .set_description("Time in seconds to sleep before next removal transaction when data is on HDD and journal is on SSD"),
3872 	
3873 	    Option("osd_failsafe_full_ratio", Option::TYPE_FLOAT, Option::LEVEL_ADVANCED)
3874 	    .set_default(.97)
3875 	    .set_description(""),
3876 	
3877 	    Option("osd_fast_fail_on_connection_refused", Option::TYPE_BOOL, Option::LEVEL_ADVANCED)
3878 	    .set_default(true)
3879 	    .set_description(""),
3880 	
3881 	    Option("osd_pg_object_context_cache_count", Option::TYPE_INT, Option::LEVEL_ADVANCED)
3882 	    .set_default(64)
3883 	    .set_description(""),
3884 	
3885 	    Option("osd_tracing", Option::TYPE_BOOL, Option::LEVEL_ADVANCED)
3886 	    .set_default(false)
3887 	    .set_description(""),
3888 	
3889 	    Option("osd_function_tracing", Option::TYPE_BOOL, Option::LEVEL_ADVANCED)
3890 	    .set_default(false)
3891 	    .set_description(""),
3892 	
3893 	    Option("osd_fast_info", Option::TYPE_BOOL, Option::LEVEL_ADVANCED)
3894 	    .set_default(true)
3895 	    .set_description(""),
3896 	
3897 	    Option("osd_debug_pg_log_writeout", Option::TYPE_BOOL, Option::LEVEL_DEV)
3898 	    .set_default(false)
3899 	    .set_description(""),
3900 	
3901 	    Option("osd_loop_before_reset_tphandle", Option::TYPE_UINT, Option::LEVEL_ADVANCED)
3902 	    .set_default(64)
3903 	    .set_description(""),
3904 	
3905 	    Option("threadpool_default_timeout", Option::TYPE_INT, Option::LEVEL_ADVANCED)
3906 	    .set_default(60)
3907 	    .set_description(""),
3908 	
3909 	    Option("threadpool_empty_queue_max_wait", Option::TYPE_INT, Option::LEVEL_ADVANCED)
3910 	    .set_default(2)
3911 	    .set_description(""),
3912 	
3913 	    Option("leveldb_log_to_ceph_log", Option::TYPE_BOOL, Option::LEVEL_ADVANCED)
3914 	    .set_default(true)
3915 	    .set_description(""),
3916 	
3917 	    Option("leveldb_write_buffer_size", Option::TYPE_SIZE, Option::LEVEL_ADVANCED)
3918 	    .set_default(8_M)
3919 	    .set_description(""),
3920 	
3921 	    Option("leveldb_cache_size", Option::TYPE_SIZE, Option::LEVEL_ADVANCED)
3922 	    .set_default(128_M)
3923 	    .set_description(""),
3924 	
3925 	    Option("leveldb_block_size", Option::TYPE_SIZE, Option::LEVEL_ADVANCED)
3926 	    .set_default(0)
3927 	    .set_description(""),
3928 	
3929 	    Option("leveldb_bloom_size", Option::TYPE_INT, Option::LEVEL_ADVANCED)
3930 	    .set_default(0)
3931 	    .set_description(""),
3932 	
3933 	    Option("leveldb_max_open_files", Option::TYPE_INT, Option::LEVEL_ADVANCED)
3934 	    .set_default(0)
3935 	    .set_description(""),
3936 	
3937 	    Option("leveldb_compression", Option::TYPE_BOOL, Option::LEVEL_ADVANCED)
3938 	    .set_default(true)
3939 	    .set_description(""),
3940 	
3941 	    Option("leveldb_paranoid", Option::TYPE_BOOL, Option::LEVEL_ADVANCED)
3942 	    .set_default(false)
3943 	    .set_description(""),
3944 	
3945 	    Option("leveldb_log", Option::TYPE_STR, Option::LEVEL_ADVANCED)
3946 	    .set_default("/dev/null")
3947 	    .set_description(""),
3948 	
3949 	    Option("leveldb_compact_on_mount", Option::TYPE_BOOL, Option::LEVEL_ADVANCED)
3950 	    .set_default(false)
3951 	    .set_description(""),
3952 	
3953 	    Option("rocksdb_log_to_ceph_log", Option::TYPE_BOOL, Option::LEVEL_ADVANCED)
3954 	    .set_default(true)
3955 	    .set_description(""),
3956 	
3957 	    Option("rocksdb_cache_size", Option::TYPE_SIZE, Option::LEVEL_ADVANCED)
3958 	    .set_default(512_M)
3959 	    .set_flag(Option::FLAG_RUNTIME)
3960 	    .set_description(""),
3961 	
3962 	    Option("rocksdb_cache_row_ratio", Option::TYPE_FLOAT, Option::LEVEL_ADVANCED)
3963 	    .set_default(0)
3964 	    .set_description(""),
3965 	
3966 	    Option("rocksdb_cache_shard_bits", Option::TYPE_INT, Option::LEVEL_ADVANCED)
3967 	    .set_default(4)
3968 	    .set_description(""),
3969 	
3970 	    Option("rocksdb_cache_type", Option::TYPE_STR, Option::LEVEL_ADVANCED)
3971 	    .set_default("binned_lru")
3972 	    .set_description(""),
3973 	
3974 	    Option("rocksdb_block_size", Option::TYPE_SIZE, Option::LEVEL_ADVANCED)
3975 	    .set_default(4_K)
3976 	    .set_description(""),
3977 	
3978 	    Option("rocksdb_perf", Option::TYPE_BOOL, Option::LEVEL_ADVANCED)
3979 	    .set_default(false)
3980 	    .set_description(""),
3981 	
3982 	    Option("rocksdb_collect_compaction_stats", Option::TYPE_BOOL, Option::LEVEL_ADVANCED)
3983 	    .set_default(false)
3984 	    .set_description(""),
3985 	
3986 	    Option("rocksdb_collect_extended_stats", Option::TYPE_BOOL, Option::LEVEL_ADVANCED)
3987 	    .set_default(false)
3988 	    .set_description(""),
3989 	
3990 	    Option("rocksdb_collect_memory_stats", Option::TYPE_BOOL, Option::LEVEL_ADVANCED)
3991 	    .set_default(false)
3992 	    .set_description(""),
3993 	
3994 	    Option("rocksdb_bloom_bits_per_key", Option::TYPE_UINT, Option::LEVEL_ADVANCED)
3995 	    .set_default(20)
3996 	    .set_description("Number of bits per key to use for RocksDB's bloom filters.")
3997 	    .set_long_description("RocksDB bloom filters can be used to quickly answer the question of whether or not a key may exist or definitely does not exist in a given RocksDB SST file without having to read all keys into memory.  Using a higher bit value decreases the likelihood of false positives at the expense of additional disk space and memory consumption when the filter is loaded into RAM.  The current default value of 20 was found to provide significant performance gains when getattr calls are made (such as during new object creation in bluestore) without significant memory overhead or cache pollution when combined with rocksdb partitioned index filters.  See: https://github.com/facebook/rocksdb/wiki/Partitioned-Index-Filters for more information."),
3998 	
3999 	    Option("rocksdb_cache_index_and_filter_blocks", Option::TYPE_BOOL, Option::LEVEL_DEV)
4000 	    .set_default(true)
4001 	    .set_description("Whether to cache indices and filters in block cache")
4002 	    .set_long_description("By default RocksDB will load an SST file's index and bloom filters into memory when it is opened and remove them from memory when an SST file is closed.  Thus, memory consumption by indices and bloom filters is directly tied to the number of concurrent SST files allowed to be kept open.  This option instead stores cached indicies and filters in the block cache where they directly compete with other cached data.  By default we set this option to true to better account for and bound rocksdb memory usage and keep filters in memory even when an SST file is closed."),
4003 	
4004 	    Option("rocksdb_cache_index_and_filter_blocks_with_high_priority", Option::TYPE_BOOL, Option::LEVEL_DEV)
4005 	    .set_default(true)
4006 	    .set_description("Whether to cache indices and filters in the block cache with high priority")
4007 	    .set_long_description("A downside of setting rocksdb_cache_index_and_filter_blocks to true is that regular data can push indices and filters out of memory.  Setting this option to true means they are cached with higher priority than other data and should typically stay in the block cache."),
4008 	
4009 	    Option("rocksdb_pin_l0_filter_and_index_blocks_in_cache", Option::TYPE_BOOL, Option::LEVEL_DEV)
4010 	    .set_default(false)
4011 	    .set_description("Whether to pin Level 0 indices and bloom filters in the block cache")
4012 	    .set_long_description("A downside of setting rocksdb_cache_index_and_filter_blocks to true is that regular data can push indices and filters out of memory.  Setting this option to true means that level 0 SST files will always have their indices and filters pinned in the block cache."),
4013 	
4014 	    Option("rocksdb_index_type", Option::TYPE_STR, Option::LEVEL_DEV)
4015 	    .set_default("binary_search")
4016 	    .set_description("Type of index for SST files: binary_search, hash_search, two_level")
4017 	    .set_long_description("This option controls the table index type.  binary_search is a space efficient index block that is optimized for block-search-based index. hash_search may improve prefix lookup performance at the expense of higher disk and memory usage and potentially slower compactions.  two_level is an experimental index type that uses two binary search indexes and works in conjunction with partition filters.  See: http://rocksdb.org/blog/2017/05/12/partitioned-index-filter.html"),
4018 	
4019 	    Option("rocksdb_partition_filters", Option::TYPE_BOOL, Option::LEVEL_DEV)
4020 	    .set_default(false)
4021 	    .set_description("(experimental) partition SST index/filters into smaller blocks")
4022 	    .set_long_description("This is an experimental option for rocksdb that works in conjunction with two_level indices to avoid having to keep the entire filter/index in cache when cache_index_and_filter_blocks is true.  The idea is to keep a much smaller top-level index in heap/cache and then opportunistically cache the lower level indices.  See: https://github.com/facebook/rocksdb/wiki/Partitioned-Index-Filters"),
4023 	
4024 	    Option("rocksdb_metadata_block_size", Option::TYPE_SIZE, Option::LEVEL_DEV)
4025 	    .set_default(4_K)
4026 	    .set_description("The block size for index partitions. (0 = rocksdb default)"),
4027 	
4028 	    Option("mon_rocksdb_options", Option::TYPE_STR, Option::LEVEL_ADVANCED)
4029 	    .set_default("write_buffer_size=33554432,"
4030 			 "compression=kNoCompression,"
4031 			 "level_compaction_dynamic_level_bytes=true")
4032 	    .set_description(""),
4033 	
4034 	    Option("osd_client_op_priority", Option::TYPE_UINT, Option::LEVEL_ADVANCED)
4035 	    .set_default(63)
4036 	    .set_description(""),
4037 	
4038 	    Option("osd_recovery_op_priority", Option::TYPE_UINT, Option::LEVEL_ADVANCED)
4039 	    .set_default(3)
4040 	    .set_description("Priority to use for recovery operations if not specified for the pool"),
4041 	
4042 	    Option("osd_peering_op_priority", Option::TYPE_UINT, Option::LEVEL_DEV)
4043 	    .set_default(255)
4044 	    .set_description(""),
4045 	
4046 	    Option("osd_snap_trim_priority", Option::TYPE_UINT, Option::LEVEL_ADVANCED)
4047 	    .set_default(5)
4048 	    .set_description(""),
4049 	
4050 	    Option("osd_snap_trim_cost", Option::TYPE_SIZE, Option::LEVEL_ADVANCED)
4051 	    .set_default(1<<20)
4052 	    .set_description(""),
4053 	
4054 	    Option("osd_pg_delete_priority", Option::TYPE_UINT, Option::LEVEL_ADVANCED)
4055 	    .set_default(5)
4056 	    .set_description(""),
4057 	
4058 	    Option("osd_pg_delete_cost", Option::TYPE_SIZE, Option::LEVEL_ADVANCED)
4059 	    .set_default(1<<20)
4060 	    .set_description(""),
4061 	
4062 	    Option("osd_scrub_priority", Option::TYPE_UINT, Option::LEVEL_ADVANCED)
4063 	    .set_default(5)
4064 	    .set_description("Priority for scrub operations in work queue"),
4065 	
4066 	    Option("osd_scrub_cost", Option::TYPE_SIZE, Option::LEVEL_ADVANCED)
4067 	    .set_default(50<<20)
4068 	    .set_description("Cost for scrub operations in work queue"),
4069 	
4070 	    Option("osd_requested_scrub_priority", Option::TYPE_UINT, Option::LEVEL_ADVANCED)
4071 	    .set_default(120)
4072 	    .set_description(""),
4073 	
4074 	    Option("osd_recovery_priority", Option::TYPE_UINT, Option::LEVEL_ADVANCED)
4075 	    .set_default(5)
4076 	    .set_description("Priority of recovery in the work queue")
4077 	    .set_long_description("Not related to a pool's recovery_priority"),
4078 	
4079 	    Option("osd_recovery_cost", Option::TYPE_SIZE, Option::LEVEL_ADVANCED)
4080 	    .set_default(20<<20)
4081 	    .set_description(""),
4082 	
4083 	    Option("osd_recovery_op_warn_multiple", Option::TYPE_UINT, Option::LEVEL_ADVANCED)
4084 	    .set_default(16)
4085 	    .set_description(""),
4086 	
4087 	    Option("osd_mon_shutdown_timeout", Option::TYPE_FLOAT, Option::LEVEL_ADVANCED)
4088 	    .set_default(5)
4089 	    .set_description(""),
4090 	
4091 	    Option("osd_shutdown_pgref_assert", Option::TYPE_BOOL, Option::LEVEL_ADVANCED)
4092 	    .set_default(false)
4093 	    .set_description(""),
4094 	
4095 	    Option("osd_max_object_size", Option::TYPE_SIZE, Option::LEVEL_ADVANCED)
4096 	    .set_default(128_M)
4097 	    .set_description(""),
4098 	
4099 	    Option("osd_max_object_name_len", Option::TYPE_UINT, Option::LEVEL_ADVANCED)
4100 	    .set_default(2048)
4101 	    .set_description(""),
4102 	
4103 	    Option("osd_max_object_namespace_len", Option::TYPE_UINT, Option::LEVEL_ADVANCED)
4104 	    .set_default(256)
4105 	    .set_description(""),
4106 	
4107 	    Option("osd_max_attr_name_len", Option::TYPE_UINT, Option::LEVEL_ADVANCED)
4108 	    .set_default(100)
4109 	    .set_description(""),
4110 	
4111 	    Option("osd_max_attr_size", Option::TYPE_UINT, Option::LEVEL_ADVANCED)
4112 	    .set_default(0)
4113 	    .set_description(""),
4114 	
4115 	    Option("osd_max_omap_entries_per_request", Option::TYPE_UINT, Option::LEVEL_ADVANCED)
4116 	    .set_default(131072)
4117 	    .set_description(""),
4118 	
4119 	    Option("osd_max_omap_bytes_per_request", Option::TYPE_SIZE, Option::LEVEL_ADVANCED)
4120 	    .set_default(1_G)
4121 	    .set_description(""),
4122 	
4123 	    Option("osd_max_write_op_reply_len", Option::TYPE_SIZE, Option::LEVEL_ADVANCED)
4124 	    .set_default(32)
4125 	    .set_description("Max size of the per-op payload for requests with the RETURNVEC flag set")
4126 	    .set_long_description("This value caps the amount of data (per op; a request may have many ops) that will be sent back to the client and recorded in the PG log."),
4127 	
4128 	    Option("osd_objectstore", Option::TYPE_STR, Option::LEVEL_ADVANCED)
4129 	    .set_default("bluestore")
4130 	    .set_enum_allowed({"bluestore", "filestore", "memstore", "kstore"})
4131 	    .set_flag(Option::FLAG_CREATE)
4132 	    .set_description("backend type for an OSD (like filestore or bluestore)"),
4133 	
4134 	    Option("osd_objectstore_tracing", Option::TYPE_BOOL, Option::LEVEL_ADVANCED)
4135 	    .set_default(false)
4136 	    .set_description(""),
4137 	
4138 	    Option("osd_objectstore_fuse", Option::TYPE_BOOL, Option::LEVEL_ADVANCED)
4139 	    .set_default(false)
4140 	    .set_description(""),
4141 	
4142 	    Option("osd_bench_small_size_max_iops", Option::TYPE_UINT, Option::LEVEL_ADVANCED)
4143 	    .set_default(100)
4144 	    .set_description(""),
4145 	
4146 	    Option("osd_bench_large_size_max_throughput", Option::TYPE_SIZE, Option::LEVEL_ADVANCED)
4147 	    .set_default(100_M)
4148 	    .set_description(""),
4149 	
4150 	    Option("osd_bench_max_block_size", Option::TYPE_SIZE, Option::LEVEL_ADVANCED)
4151 	    .set_default(64_M)
4152 	    .set_description(""),
4153 	
4154 	    Option("osd_bench_duration", Option::TYPE_UINT, Option::LEVEL_ADVANCED)
4155 	    .set_default(30)
4156 	    .set_description(""),
4157 	
4158 	    Option("osd_blkin_trace_all", Option::TYPE_BOOL, Option::LEVEL_ADVANCED)
4159 	    .set_default(false)
4160 	    .set_description(""),
4161 	
4162 	    Option("osdc_blkin_trace_all", Option::TYPE_BOOL, Option::LEVEL_ADVANCED)
4163 	    .set_default(false)
4164 	    .set_description(""),
4165 	
4166 	    Option("osd_discard_disconnected_ops", Option::TYPE_BOOL, Option::LEVEL_ADVANCED)
4167 	    .set_default(true)
4168 	    .set_description(""),
4169 	
4170 	    Option("osd_memory_target", Option::TYPE_SIZE, Option::LEVEL_BASIC)
4171 	    .set_default(4_G)
4172 	    .set_min(896_M)
4173 	    .set_flag(Option::FLAG_RUNTIME)
4174 	    .add_see_also("bluestore_cache_autotune")
4175 	    .add_see_also("osd_memory_cache_min")
4176 	    .add_see_also("osd_memory_base")
4177 	    .set_description("When tcmalloc and cache autotuning is enabled, try to keep this many bytes mapped in memory.")
4178 	    .set_long_description("The minimum value must be at least equal to osd_memory_base + osd_memory_cache_min."),
4179 	
4180 	    Option("osd_memory_target_cgroup_limit_ratio", Option::TYPE_FLOAT, Option::LEVEL_ADVANCED)
4181 	    .set_default(0.8)
4182 	    .set_min_max(0.0, 1.0)
4183 	    .add_see_also("osd_memory_target")
4184 	    .set_description("Set the default value for osd_memory_target to the cgroup memory limit (if set) times this value")
4185 	    .set_long_description("A value of 0 disables this feature."),
4186 	
4187 	    Option("osd_memory_base", Option::TYPE_SIZE, Option::LEVEL_DEV)
4188 	    .set_default(768_M)
4189 	    .set_flag(Option::FLAG_RUNTIME)
4190 	    .add_see_also("bluestore_cache_autotune")
4191 	    .set_description("When tcmalloc and cache autotuning is enabled, estimate the minimum amount of memory in bytes the OSD will need."),
4192 	
4193 	    Option("osd_memory_expected_fragmentation", Option::TYPE_FLOAT, Option::LEVEL_DEV)
4194 	    .set_default(0.15)
4195 	    .set_min_max(0.0, 1.0)
4196 	    .set_flag(Option::FLAG_RUNTIME)
4197 	    .add_see_also("bluestore_cache_autotune")
4198 	    .set_description("When tcmalloc and cache autotuning is enabled, estimate the percent of memory fragmentation."),
4199 	
4200 	    Option("osd_memory_cache_min", Option::TYPE_SIZE, Option::LEVEL_DEV)
4201 	    .set_default(128_M)
4202 	    .set_min(128_M)
4203 	    .set_flag(Option::FLAG_RUNTIME)
4204 	    .add_see_also("bluestore_cache_autotune")
4205 	    .set_description("When tcmalloc and cache autotuning is enabled, set the minimum amount of memory used for caches."),
4206 	
4207 	    Option("osd_memory_cache_resize_interval", Option::TYPE_FLOAT, Option::LEVEL_DEV)
4208 	    .set_default(1)
4209 	    .add_see_also("bluestore_cache_autotune")
4210 	    .set_description("When tcmalloc and cache autotuning is enabled, wait this many seconds between resizing caches."),
4211 	
4212 	    Option("memstore_device_bytes", Option::TYPE_SIZE, Option::LEVEL_ADVANCED)
4213 	    .set_default(1_G)
4214 	    .set_description(""),
4215 	
4216 	    Option("memstore_page_set", Option::TYPE_BOOL, Option::LEVEL_ADVANCED)
4217 	    .set_default(false)
4218 	    .set_description(""),
4219 	
4220 	    Option("memstore_page_size", Option::TYPE_SIZE, Option::LEVEL_ADVANCED)
4221 	    .set_default(64_K)
4222 	    .set_description(""),
4223 	
4224 	    Option("memstore_debug_omit_block_device_write", Option::TYPE_BOOL, Option::LEVEL_DEV)
4225 	    .set_default(false)
4226 	    .add_see_also("bluestore_debug_omit_block_device_write")
4227 	    .set_description("write metadata only"),
4228 	
4229 	    Option("objectstore_blackhole", Option::TYPE_BOOL, Option::LEVEL_ADVANCED)
4230 	    .set_default(false)
4231 	    .set_description(""),
4232 	
4233 	    // --------------------------
4234 	    // bluestore
4235 	
4236 	    Option("bdev_debug_inflight_ios", Option::TYPE_BOOL, Option::LEVEL_DEV)
4237 	    .set_default(false)
4238 	    .set_description(""),
4239 	
4240 	    Option("bdev_inject_crash", Option::TYPE_INT, Option::LEVEL_DEV)
4241 	    .set_default(0)
4242 	    .set_description(""),
4243 	
4244 	    Option("bdev_inject_crash_flush_delay", Option::TYPE_INT, Option::LEVEL_DEV)
4245 	    .set_default(2)
4246 	    .set_description(""),
4247 	
4248 	    Option("bdev_aio", Option::TYPE_BOOL, Option::LEVEL_ADVANCED)
4249 	    .set_default(true)
4250 	    .set_description(""),
4251 	
4252 	    Option("bdev_aio_poll_ms", Option::TYPE_INT, Option::LEVEL_ADVANCED)
4253 	    .set_default(250)
4254 	    .set_description(""),
4255 	
4256 	    Option("bdev_aio_max_queue_depth", Option::TYPE_INT, Option::LEVEL_ADVANCED)
4257 	    .set_default(1024)
4258 	    .set_description(""),
4259 	
4260 	    Option("bdev_aio_reap_max", Option::TYPE_INT, Option::LEVEL_ADVANCED)
4261 	    .set_default(16)
4262 	    .set_description(""),
4263 	
4264 	    Option("bdev_block_size", Option::TYPE_SIZE, Option::LEVEL_ADVANCED)
4265 	    .set_default(4_K)
4266 	    .set_description(""),
4267 	
4268 	    Option("bdev_debug_aio", Option::TYPE_BOOL, Option::LEVEL_DEV)
4269 	    .set_default(false)
4270 	    .set_description(""),
4271 	
4272 	    Option("bdev_debug_aio_suicide_timeout", Option::TYPE_FLOAT, Option::LEVEL_DEV)
4273 	    .set_default(60.0)
4274 	    .set_description(""),
4275 	
4276 	    Option("bdev_debug_aio_log_age", Option::TYPE_FLOAT, Option::LEVEL_DEV)
4277 	    .set_default(5.0)
4278 	    .set_description(""),
4279 	
4280 	    Option("bdev_nvme_unbind_from_kernel", Option::TYPE_BOOL, Option::LEVEL_ADVANCED)
4281 	    .set_default(false)
4282 	    .set_description(""),
4283 	
4284 	    Option("bdev_nvme_retry_count", Option::TYPE_INT, Option::LEVEL_ADVANCED)
4285 	    .set_default(-1)
4286 	    .set_description(""),
4287 	
4288 	    Option("bdev_enable_discard", Option::TYPE_BOOL, Option::LEVEL_ADVANCED)
4289 	    .set_default(false)
4290 	    .set_description(""),
4291 	
4292 	    Option("bdev_async_discard", Option::TYPE_BOOL, Option::LEVEL_ADVANCED)
4293 	    .set_default(false)
4294 	    .set_description(""),
4295 	
4296 	    Option("bluefs_alloc_size", Option::TYPE_SIZE, Option::LEVEL_ADVANCED)
4297 	    .set_default(1_M)
4298 	    .set_description("Allocation unit size for DB and WAL devices"),
4299 	
4300 	    Option("bluefs_shared_alloc_size", Option::TYPE_SIZE, Option::LEVEL_ADVANCED)
4301 	    .set_default(64_K)
4302 	    .set_description("Allocation unit size for primary/shared device"),
4303 	
4304 	    Option("bluefs_max_prefetch", Option::TYPE_SIZE, Option::LEVEL_ADVANCED)
4305 	    .set_default(1_M)
4306 	    .set_description(""),
4307 	
4308 	    Option("bluefs_min_log_runway", Option::TYPE_SIZE, Option::LEVEL_ADVANCED)
4309 	    .set_default(1_M)
4310 	    .set_description(""),
4311 	
4312 	    Option("bluefs_max_log_runway", Option::TYPE_SIZE, Option::LEVEL_ADVANCED)
4313 	    .set_default(4194304)
4314 	    .set_description(""),
4315 	
4316 	    Option("bluefs_log_compact_min_ratio", Option::TYPE_FLOAT, Option::LEVEL_ADVANCED)
4317 	    .set_default(5.0)
4318 	    .set_description(""),
4319 	
4320 	    Option("bluefs_log_compact_min_size", Option::TYPE_SIZE, Option::LEVEL_ADVANCED)
4321 	    .set_default(16_M)
4322 	    .set_description(""),
4323 	
4324 	    Option("bluefs_min_flush_size", Option::TYPE_SIZE, Option::LEVEL_ADVANCED)
4325 	    .set_default(512_K)
4326 	    .set_description(""),
4327 	
4328 	    Option("bluefs_compact_log_sync", Option::TYPE_BOOL, Option::LEVEL_ADVANCED)
4329 	    .set_default(false)
4330 	    .set_description(""),
4331 	
4332 	    Option("bluefs_buffered_io", Option::TYPE_BOOL, Option::LEVEL_ADVANCED)
4333 	    .set_default(true)
4334 	    .set_description(""),
4335 	
4336 	    Option("bluefs_sync_write", Option::TYPE_BOOL, Option::LEVEL_ADVANCED)
4337 	    .set_default(false)
4338 	    .set_description(""),
4339 	
4340 	    Option("bluefs_allocator", Option::TYPE_STR, Option::LEVEL_DEV)
4341 	    .set_default("bitmap")
4342 	    .set_description(""),
4343 	
4344 	    Option("bluefs_preextend_wal_files", Option::TYPE_BOOL, Option::LEVEL_ADVANCED)
4345 	    .set_default(true)
4346 	    .set_description("Preextent rocksdb wal files on mkfs to avoid performance penalty for young stores"),
4347 	
4348 	    Option("bluestore_bluefs", Option::TYPE_BOOL, Option::LEVEL_DEV)
4349 	    .set_default(true)
4350 	    .set_flag(Option::FLAG_CREATE)
4351 	    .set_description("Use BlueFS to back rocksdb")
4352 	    .set_long_description("BlueFS allows rocksdb to share the same physical device(s) as the rest of BlueStore.  It should be used in all cases unless testing/developing an alternative metadata database for BlueStore."),
4353 	
4354 	    Option("bluestore_bluefs_env_mirror", Option::TYPE_BOOL, Option::LEVEL_DEV)
4355 	    .set_default(false)
4356 	    .set_flag(Option::FLAG_CREATE)
4357 	    .set_description("Mirror bluefs data to file system for testing/validation"),
4358 	
4359 	    Option("bluestore_bluefs_min", Option::TYPE_SIZE, Option::LEVEL_ADVANCED)
4360 	    .set_default(1_G)
4361 	    .set_description("minimum disk space allocated to BlueFS (e.g., at mkfs)"),
4362 	
4363 	    Option("bluestore_bluefs_min_free", Option::TYPE_SIZE, Option::LEVEL_ADVANCED)
4364 	    .set_default(1_G)
4365 	    .set_description("minimum free space allocated to BlueFS"),
4366 	
4367 	    Option("bluestore_bluefs_max_free", Option::TYPE_SIZE, Option::LEVEL_ADVANCED)
4368 	    .set_default(10_G)
4369 	    .set_description("Maximum free space allocated to BlueFS"),
4370 	
4371 	    Option("bluestore_bluefs_min_ratio", Option::TYPE_FLOAT, Option::LEVEL_ADVANCED)
4372 	    .set_default(.02)
4373 	    .set_description("Minimum fraction of free space devoted to BlueFS"),
4374 	
4375 	    Option("bluestore_bluefs_max_ratio", Option::TYPE_FLOAT, Option::LEVEL_ADVANCED)
4376 	    .set_default(.90)
4377 	    .set_description("Maximum fraction of free storage devoted to BlueFS"),
4378 	
4379 	    Option("bluestore_bluefs_gift_ratio", Option::TYPE_FLOAT, Option::LEVEL_ADVANCED)
4380 	    .set_default(.02)
4381 	    .set_description("Maximum fraction of free space to give to BlueFS at once"),
4382 	
4383 	    Option("bluestore_bluefs_reclaim_ratio", Option::TYPE_FLOAT, Option::LEVEL_ADVANCED)
4384 	    .set_default(.20)
4385 	    .set_description("Maximum fraction of free space to reclaim from BlueFS at once"),
4386 	
4387 	    Option("bluestore_bluefs_balance_interval", Option::TYPE_FLOAT, Option::LEVEL_ADVANCED)
4388 	    .set_default(1)
4389 	    .set_description("How frequently (in seconds) to balance free space between BlueFS and BlueStore"),
4390 	
4391 	    Option("bluestore_bluefs_alloc_failure_dump_interval", Option::TYPE_FLOAT, Option::LEVEL_ADVANCED)
4392 	    .set_default(0)
4393 	    .set_description("How frequently (in seconds) to dump allocator on"
4394 	      "BlueFS space allocation failure"),
4395 	
4396 	    Option("bluestore_bluefs_db_compatibility", Option::TYPE_BOOL, Option::LEVEL_DEV)
4397 	    .set_default(true)
4398 	    .set_description("Sync db with legacy bluefs extents info")
4399 	    .set_long_description("Enforces db sync with legacy bluefs extents information on close."
4400 	                          " Enables downgrades to pre-nautilus releases"),
4401 	
4402 	    Option("bluestore_spdk_mem", Option::TYPE_SIZE, Option::LEVEL_DEV)
4403 	    .set_default(512)
4404 	    .set_description("Amount of dpdk memory size in MB")
4405 	    .set_long_description("If running multiple SPDK instances per node, you must specify the amount of dpdk memory size in MB each instance will use, to make sure each instance uses its own dpdk memory"),
4406 	
4407 	    Option("bluestore_spdk_coremask", Option::TYPE_STR, Option::LEVEL_DEV)
4408 	    .set_default("0x1")
4409 	    .set_description("A hexadecimal bit mask of the cores to run on. Note the core numbering can change between platforms and should be determined beforehand"),
4410 	
4411 	    Option("bluestore_spdk_max_io_completion", Option::TYPE_UINT, Option::LEVEL_DEV)
4412 	    .set_default(0)
4413 	    .set_description("Maximal I/Os to be batched completed while checking queue pair completions, 0 means let spdk library determine it"),
4414 	
4415 	    Option("bluestore_spdk_io_sleep", Option::TYPE_UINT, Option::LEVEL_DEV)
4416 	    .set_default(5)
4417 	    .set_description("Time period to wait if there is no completed I/O from polling"),
4418 	
4419 	    Option("bluestore_block_path", Option::TYPE_STR, Option::LEVEL_DEV)
4420 	    .set_default("")
4421 	    .set_flag(Option::FLAG_CREATE)
4422 	    .set_description("Path to block device/file"),
4423 	
4424 	    Option("bluestore_block_size", Option::TYPE_SIZE, Option::LEVEL_DEV)
4425 	    .set_default(1_T)
4426 	    .set_flag(Option::FLAG_CREATE)
4427 	    .set_description("Size of file to create for backing bluestore"),
4428 	
4429 	    Option("bluestore_block_create", Option::TYPE_BOOL, Option::LEVEL_DEV)
4430 	    .set_default(true)
4431 	    .set_flag(Option::FLAG_CREATE)
4432 	    .set_description("Create bluestore_block_path if it doesn't exist")
4433 	    .add_see_also("bluestore_block_path").add_see_also("bluestore_block_size"),
4434 	
4435 	    Option("bluestore_block_db_path", Option::TYPE_STR, Option::LEVEL_DEV)
4436 	    .set_default("")
4437 	    .set_flag(Option::FLAG_CREATE)
4438 	    .set_description("Path for db block device"),
4439 	
4440 	    Option("bluestore_block_db_size", Option::TYPE_UINT, Option::LEVEL_DEV)
4441 	    .set_default(0)
4442 	    .set_flag(Option::FLAG_CREATE)
4443 	    .set_description("Size of file to create for bluestore_block_db_path"),
4444 	
4445 	    Option("bluestore_block_db_create", Option::TYPE_BOOL, Option::LEVEL_DEV)
4446 	    .set_default(false)
4447 	    .set_flag(Option::FLAG_CREATE)
4448 	    .set_description("Create bluestore_block_db_path if it doesn't exist")
4449 	    .add_see_also("bluestore_block_db_path")
4450 	    .add_see_also("bluestore_block_db_size"),
4451 	
4452 	    Option("bluestore_block_wal_path", Option::TYPE_STR, Option::LEVEL_DEV)
4453 	    .set_default("")
4454 	    .set_flag(Option::FLAG_CREATE)
4455 	    .set_description("Path to block device/file backing bluefs wal"),
4456 	
4457 	    Option("bluestore_block_wal_size", Option::TYPE_SIZE, Option::LEVEL_DEV)
4458 	    .set_default(96_M)
4459 	    .set_flag(Option::FLAG_CREATE)
4460 	    .set_description("Size of file to create for bluestore_block_wal_path"),
4461 	
4462 	    Option("bluestore_block_wal_create", Option::TYPE_BOOL, Option::LEVEL_DEV)
4463 	    .set_default(false)
4464 	    .set_flag(Option::FLAG_CREATE)
4465 	    .set_description("Create bluestore_block_wal_path if it doesn't exist")
4466 	    .add_see_also("bluestore_block_wal_path")
4467 	    .add_see_also("bluestore_block_wal_size"),
4468 	
4469 	    Option("bluestore_block_preallocate_file", Option::TYPE_BOOL, Option::LEVEL_DEV)
4470 	    .set_default(false)
4471 	    .set_flag(Option::FLAG_CREATE)
4472 	    .set_description("Preallocate file created via bluestore_block*_create"),
4473 	
4474 	    Option("bluestore_ignore_data_csum", Option::TYPE_BOOL, Option::LEVEL_DEV)
4475 	    .set_default(false)
4476 	    .set_flag(Option::FLAG_RUNTIME)
4477 	    .set_description("Ignore checksum errors on read and do not generate an EIO error"),
4478 	
4479 	    Option("bluestore_csum_type", Option::TYPE_STR, Option::LEVEL_ADVANCED)
4480 	    .set_default("crc32c")
4481 	    .set_enum_allowed({"none", "crc32c", "crc32c_16", "crc32c_8", "xxhash32", "xxhash64"})
4482 	    .set_flag(Option::FLAG_RUNTIME)
4483 	    .set_description("Default checksum algorithm to use")
4484 	    .set_long_description("crc32c, xxhash32, and xxhash64 are available.  The _16 and _8 variants use only a subset of the bits for more compact (but less reliable) checksumming."),
4485 	
4486 	    Option("bluestore_retry_disk_reads", Option::TYPE_UINT, Option::LEVEL_ADVANCED)
4487 	    .set_default(3)
4488 	    .set_min_max(0, 255)
4489 	    .set_flag(Option::FLAG_RUNTIME)
4490 	    .set_description("Number of read retries on checksum validation error")
4491 	    .set_long_description("Retries to read data from the disk this many times when checksum validation fails to handle spurious read errors gracefully."),
4492 	
4493 	    Option("bluestore_min_alloc_size", Option::TYPE_UINT, Option::LEVEL_ADVANCED)
4494 	    .set_default(0)
4495 	    .set_flag(Option::FLAG_CREATE)
4496 	    .set_description("Minimum allocation size to allocate for an object")
4497 	    .set_long_description("A smaller allocation size generally means less data is read and then rewritten when a copy-on-write operation is triggered (e.g., when writing to something that was recently snapshotted).  Similarly, less data is journaled before performing an overwrite (writes smaller than min_alloc_size must first pass through the BlueStore journal).  Larger values of min_alloc_size reduce the amount of metadata required to describe the on-disk layout and reduce overall fragmentation."),
4498 	
4499 	    Option("bluestore_min_alloc_size_hdd", Option::TYPE_SIZE, Option::LEVEL_ADVANCED)
4500 	    .set_default(64_K)
4501 	    .set_flag(Option::FLAG_CREATE)
4502 	    .set_description("Default min_alloc_size value for rotational media")
4503 	    .add_see_also("bluestore_min_alloc_size"),
4504 	
4505 	    Option("bluestore_min_alloc_size_ssd", Option::TYPE_SIZE, Option::LEVEL_ADVANCED)
4506 	    .set_default(16_K)
4507 	    .set_flag(Option::FLAG_CREATE)
4508 	    .set_description("Default min_alloc_size value for non-rotational (solid state)  media")
4509 	    .add_see_also("bluestore_min_alloc_size"),
4510 	
4511 	    Option("bluestore_max_alloc_size", Option::TYPE_SIZE, Option::LEVEL_ADVANCED)
4512 	    .set_default(0)
4513 	    .set_flag(Option::FLAG_CREATE)
4514 	    .set_description("Maximum size of a single allocation (0 for no max)"),
4515 	
4516 	    Option("bluestore_prefer_deferred_size", Option::TYPE_SIZE, Option::LEVEL_ADVANCED)
4517 	    .set_default(0)
4518 	    .set_flag(Option::FLAG_RUNTIME)
4519 	    .set_description("Writes smaller than this size will be written to the journal and then asynchronously written to the device.  This can be beneficial when using rotational media where seeks are expensive, and is helpful both with and without solid state journal/wal devices."),
4520 	
4521 	    Option("bluestore_prefer_deferred_size_hdd", Option::TYPE_SIZE, Option::LEVEL_ADVANCED)
4522 	    .set_default(32768)
4523 	    .set_flag(Option::FLAG_RUNTIME)
4524 	    .set_description("Default bluestore_prefer_deferred_size for rotational media")
4525 	    .add_see_also("bluestore_prefer_deferred_size"),
4526 	
4527 	    Option("bluestore_prefer_deferred_size_ssd", Option::TYPE_SIZE, Option::LEVEL_ADVANCED)
4528 	    .set_default(0)
4529 	    .set_flag(Option::FLAG_RUNTIME)
4530 	    .set_description("Default bluestore_prefer_deferred_size for non-rotational (solid state) media")
4531 	    .add_see_also("bluestore_prefer_deferred_size"),
4532 	
4533 	    Option("bluestore_compression_mode", Option::TYPE_STR, Option::LEVEL_ADVANCED)
4534 	    .set_default("none")
4535 	    .set_enum_allowed({"none", "passive", "aggressive", "force"})
4536 	    .set_flag(Option::FLAG_RUNTIME)
4537 	    .set_description("Default policy for using compression when pool does not specify")
4538 	    .set_long_description("'none' means never use compression.  'passive' means use compression when clients hint that data is compressible.  'aggressive' means use compression unless clients hint that data is not compressible.  This option is used when the per-pool property for the compression mode is not present."),
4539 	
4540 	    Option("bluestore_compression_algorithm", Option::TYPE_STR, Option::LEVEL_ADVANCED)
4541 	    .set_default("snappy")
4542 	    .set_enum_allowed({"", "snappy", "zlib", "zstd", "lz4"})
4543 	    .set_flag(Option::FLAG_RUNTIME)
4544 	    .set_description("Default compression algorithm to use when writing object data")
4545 	    .set_long_description("This controls the default compressor to use (if any) if the per-pool property is not set.  Note that zstd is *not* recommended for bluestore due to high CPU overhead when compressing small amounts of data."),
4546 	
4547 	    Option("bluestore_compression_min_blob_size", Option::TYPE_SIZE, Option::LEVEL_ADVANCED)
4548 	    .set_default(0)
4549 	    .set_flag(Option::FLAG_RUNTIME)
4550 	    .set_description("Maximum chunk size to apply compression to when random access is expected for an object.")
4551 	    .set_long_description("Chunks larger than this are broken into smaller chunks before being compressed"),
4552 	
4553 	    Option("bluestore_compression_min_blob_size_hdd", Option::TYPE_SIZE, Option::LEVEL_ADVANCED)
4554 	    .set_default(128_K)
4555 	    .set_flag(Option::FLAG_RUNTIME)
4556 	    .set_description("Default value of bluestore_compression_min_blob_size for rotational media")
4557 	    .add_see_also("bluestore_compression_min_blob_size"),
4558 	
4559 	    Option("bluestore_compression_min_blob_size_ssd", Option::TYPE_SIZE, Option::LEVEL_ADVANCED)
4560 	    .set_default(8_K)
4561 	    .set_flag(Option::FLAG_RUNTIME)
4562 	    .set_description("Default value of bluestore_compression_min_blob_size for non-rotational (solid state) media")
4563 	    .add_see_also("bluestore_compression_min_blob_size"),
4564 	
4565 	    Option("bluestore_compression_max_blob_size", Option::TYPE_SIZE, Option::LEVEL_ADVANCED)
4566 	    .set_default(0)
4567 	    .set_flag(Option::FLAG_RUNTIME)
4568 	    .set_description("Maximum chunk size to apply compression to when non-random access is expected for an object.")
4569 	    .set_long_description("Chunks larger than this are broken into smaller chunks before being compressed"),
4570 	
4571 	    Option("bluestore_compression_max_blob_size_hdd", Option::TYPE_SIZE, Option::LEVEL_ADVANCED)
4572 	    .set_default(512_K)
4573 	    .set_flag(Option::FLAG_RUNTIME)
4574 	    .set_description("Default value of bluestore_compression_max_blob_size for rotational media")
4575 	    .add_see_also("bluestore_compression_max_blob_size"),
4576 	
4577 	    Option("bluestore_compression_max_blob_size_ssd", Option::TYPE_SIZE, Option::LEVEL_ADVANCED)
4578 	    .set_default(64_K)
4579 	    .set_flag(Option::FLAG_RUNTIME)
4580 	    .set_description("Default value of bluestore_compression_max_blob_size for non-rotational (solid state) media")
4581 	    .add_see_also("bluestore_compression_max_blob_size"),
4582 	
4583 	    Option("bluestore_gc_enable_blob_threshold", Option::TYPE_INT, Option::LEVEL_DEV)
4584 	    .set_default(0)
4585 	    .set_flag(Option::FLAG_RUNTIME)
4586 	    .set_description(""),
4587 	
4588 	    Option("bluestore_gc_enable_total_threshold", Option::TYPE_INT, Option::LEVEL_DEV)
4589 	    .set_default(0)
4590 	    .set_flag(Option::FLAG_RUNTIME)
4591 	    .set_description(""),
4592 	
4593 	    Option("bluestore_max_blob_size", Option::TYPE_SIZE, Option::LEVEL_DEV)
4594 	    .set_default(0)
4595 	    .set_flag(Option::FLAG_RUNTIME)
4596 	    .set_description("")
4597 	    .set_long_description("Bluestore blobs are collections of extents (ie on-disk data) originating from one or more objects.  Blobs can be compressed, typically have checksum data, may be overwritten, may be shared (with an extent ref map), or split.  This setting controls the maximum size a blob is allowed to be."),
4598 	
4599 	    Option("bluestore_max_blob_size_hdd", Option::TYPE_SIZE, Option::LEVEL_DEV)
4600 	    .set_default(512_K)
4601 	    .set_flag(Option::FLAG_RUNTIME)
4602 	    .set_description("")
4603 	    .add_see_also("bluestore_max_blob_size"),
4604 	
4605 	    Option("bluestore_max_blob_size_ssd", Option::TYPE_SIZE, Option::LEVEL_DEV)
4606 	    .set_default(64_K)
4607 	    .set_flag(Option::FLAG_RUNTIME)
4608 	    .set_description("")
4609 	    .add_see_also("bluestore_max_blob_size"),
4610 	
4611 	    Option("bluestore_compression_required_ratio", Option::TYPE_FLOAT, Option::LEVEL_ADVANCED)
4612 	    .set_default(.875)
4613 	    .set_flag(Option::FLAG_RUNTIME)
4614 	    .set_description("Compression ratio required to store compressed data")
4615 	    .set_long_description("If we compress data and get less than this we discard the result and store the original uncompressed data."),
4616 	
4617 	    Option("bluestore_extent_map_shard_max_size", Option::TYPE_SIZE, Option::LEVEL_DEV)
4618 	    .set_default(1200)
4619 	    .set_description("Max size (bytes) for a single extent map shard before splitting"),
4620 	
4621 	    Option("bluestore_extent_map_shard_target_size", Option::TYPE_SIZE, Option::LEVEL_DEV)
4622 	    .set_default(500)
4623 	    .set_description("Target size (bytes) for a single extent map shard"),
4624 	
4625 	    Option("bluestore_extent_map_shard_min_size", Option::TYPE_SIZE, Option::LEVEL_DEV)
4626 	    .set_default(150)
4627 	    .set_description("Min size (bytes) for a single extent map shard before merging"),
4628 	
4629 	    Option("bluestore_extent_map_shard_target_size_slop", Option::TYPE_FLOAT, Option::LEVEL_DEV)
4630 	    .set_default(.2)
4631 	    .set_description("Ratio above/below target for a shard when trying to align to an existing extent or blob boundary"),
4632 	
4633 	    Option("bluestore_extent_map_inline_shard_prealloc_size", Option::TYPE_SIZE, Option::LEVEL_DEV)
4634 	    .set_default(256)
4635 	    .set_description("Preallocated buffer for inline shards"),
4636 	
4637 	    Option("bluestore_cache_trim_interval", Option::TYPE_FLOAT, Option::LEVEL_ADVANCED)
4638 	    .set_default(.05)
4639 	    .set_description("How frequently we trim the bluestore cache"),
4640 	
4641 	    Option("bluestore_cache_trim_max_skip_pinned", Option::TYPE_UINT, Option::LEVEL_DEV)
4642 	    .set_default(64)
4643 	    .set_description("Max pinned cache entries we consider before giving up"),
4644 	
4645 	    Option("bluestore_cache_type", Option::TYPE_STR, Option::LEVEL_DEV)
4646 	    .set_default("2q")
4647 	    .set_enum_allowed({"2q", "lru"})
4648 	    .set_description("Cache replacement algorithm"),
4649 	
4650 	    Option("bluestore_2q_cache_kin_ratio", Option::TYPE_FLOAT, Option::LEVEL_DEV)
4651 	    .set_default(.5)
4652 	    .set_description("2Q paper suggests .5"),
4653 	
4654 	    Option("bluestore_2q_cache_kout_ratio", Option::TYPE_FLOAT, Option::LEVEL_DEV)
4655 	    .set_default(.5)
4656 	    .set_description("2Q paper suggests .5"),
4657 	
4658 	    Option("bluestore_cache_size", Option::TYPE_SIZE, Option::LEVEL_DEV)
4659 	    .set_default(0)
4660 	    .set_description("Cache size (in bytes) for BlueStore")
4661 	    .set_long_description("This includes data and metadata cached by BlueStore as well as memory devoted to rocksdb's cache(s)."),
4662 	
4663 	    Option("bluestore_cache_size_hdd", Option::TYPE_SIZE, Option::LEVEL_DEV)
4664 	    .set_default(1_G)
4665 	    .set_description("Default bluestore_cache_size for rotational media")
4666 	    .add_see_also("bluestore_cache_size"),
4667 	
4668 	    Option("bluestore_cache_size_ssd", Option::TYPE_SIZE, Option::LEVEL_DEV)
4669 	    .set_default(3_G)
4670 	    .set_description("Default bluestore_cache_size for non-rotational (solid state) media")
4671 	    .add_see_also("bluestore_cache_size"),
4672 	
4673 	    Option("bluestore_cache_meta_ratio", Option::TYPE_FLOAT, Option::LEVEL_DEV)
4674 	    .set_default(.4)
4675 	    .add_see_also("bluestore_cache_size")
4676 	    .set_description("Ratio of bluestore cache to devote to metadata"),
4677 	
4678 	    Option("bluestore_cache_kv_ratio", Option::TYPE_FLOAT, Option::LEVEL_DEV)
4679 	    .set_default(.4)
4680 	    .add_see_also("bluestore_cache_size")
4681 	    .set_description("Ratio of bluestore cache to devote to kv database (rocksdb)"),
4682 	
4683 	    Option("bluestore_cache_autotune", Option::TYPE_BOOL, Option::LEVEL_DEV)
4684 	    .set_default(true)
4685 	    .add_see_also("bluestore_cache_size")
4686 	    .add_see_also("bluestore_cache_meta_ratio")
4687 	    .set_description("Automatically tune the ratio of caches while respecting min values."),
4688 	
4689 	    Option("bluestore_cache_autotune_interval", Option::TYPE_FLOAT, Option::LEVEL_DEV)
4690 	    .set_default(5)
4691 	    .add_see_also("bluestore_cache_autotune")
4692 	    .set_description("The number of seconds to wait between rebalances when cache autotune is enabled."),
4693 	
4694 	    Option("bluestore_kvbackend", Option::TYPE_STR, Option::LEVEL_DEV)
4695 	    .set_default("rocksdb")
4696 	    .set_flag(Option::FLAG_CREATE)
4697 	    .set_description("Key value database to use for bluestore"),
4698 	
4699 	    Option("bluestore_allocator", Option::TYPE_STR, Option::LEVEL_ADVANCED)
4700 	    .set_default("bitmap")
4701 	    .set_enum_allowed({"bitmap", "stupid"})
4702 	    .set_description("Allocator policy")
4703 	    .set_long_description("Allocator to use for bluestore.  Stupid should only be used for testing."),
4704 	
4705 	    Option("bluestore_freelist_blocks_per_key", Option::TYPE_SIZE, Option::LEVEL_DEV)
4706 	    .set_default(128)
4707 	    .set_description("Block (and bits) per database key"),
4708 	
4709 	    Option("bluestore_bitmapallocator_blocks_per_zone", Option::TYPE_SIZE, Option::LEVEL_DEV)
4710 	    .set_default(1024)
4711 	    .set_description(""),
4712 	
4713 	    Option("bluestore_bitmapallocator_span_size", Option::TYPE_SIZE, Option::LEVEL_DEV)
4714 	    .set_default(1024)
4715 	    .set_description(""),
4716 	
4717 	    Option("bluestore_max_deferred_txc", Option::TYPE_UINT, Option::LEVEL_ADVANCED)
4718 	    .set_default(32)
4719 	    .set_description("Max transactions with deferred writes that can accumulate before we force flush deferred writes"),
4720 	
4721 	    Option("bluestore_max_defer_interval", Option::TYPE_FLOAT, Option::LEVEL_ADVANCED)
4722 	    .set_default(3)
4723 	    .set_description("max duration to force deferred submit"),
4724 	
4725 	    Option("bluestore_rocksdb_options", Option::TYPE_STR, Option::LEVEL_ADVANCED)
4726 	    .set_default("compression=kNoCompression,max_write_buffer_number=4,min_write_buffer_number_to_merge=1,recycle_log_file_num=4,write_buffer_size=268435456,writable_file_max_buffer_size=0,compaction_readahead_size=2097152,max_background_compactions=2")
4727 	    .set_description("Rocksdb options"),
4728 	
4729 	    Option("bluestore_rocksdb_cf", Option::TYPE_BOOL, Option::LEVEL_ADVANCED)
4730 	    .set_default(false)
4731 	    .set_description("Enable use of rocksdb column families for bluestore metadata"),
4732 	
4733 	    Option("bluestore_rocksdb_cfs", Option::TYPE_STR, Option::LEVEL_DEV)
4734 	    .set_default("M= P= L=")
4735 	    .set_description("List of whitespace-separate key/value pairs where key is CF name and value is CF options"),
4736 	
4737 	    Option("bluestore_fsck_on_mount", Option::TYPE_BOOL, Option::LEVEL_DEV)
4738 	    .set_default(false)
4739 	    .set_description("Run fsck at mount"),
4740 	
4741 	    Option("bluestore_fsck_on_mount_deep", Option::TYPE_BOOL, Option::LEVEL_DEV)
4742 	    .set_default(false)
4743 	    .set_description("Run deep fsck at mount when bluestore_fsck_on_mount is set to true"),
4744 	
4745 	    Option("bluestore_fsck_quick_fix_on_mount", Option::TYPE_BOOL, Option::LEVEL_DEV)
4746 	      .set_default(true)
4747 	      .set_description("Do quick-fix for the store at mount"),
4748 	
4749 	    Option("bluestore_fsck_on_umount", Option::TYPE_BOOL, Option::LEVEL_DEV)
4750 	    .set_default(false)
4751 	    .set_description("Run fsck at umount"),
4752 	
4753 	    Option("bluestore_fsck_on_umount_deep", Option::TYPE_BOOL, Option::LEVEL_DEV)
4754 	    .set_default(false)
4755 	    .set_description("Run deep fsck at umount when bluestore_fsck_on_umount is set to true"),
4756 	
4757 	    Option("bluestore_fsck_on_mkfs", Option::TYPE_BOOL, Option::LEVEL_DEV)
4758 	    .set_default(true)
4759 	    .set_description("Run fsck after mkfs"),
4760 	
4761 	    Option("bluestore_fsck_on_mkfs_deep", Option::TYPE_BOOL, Option::LEVEL_DEV)
4762 	    .set_default(false)
4763 	    .set_description("Run deep fsck after mkfs"),
4764 	
4765 	    Option("bluestore_sync_submit_transaction", Option::TYPE_BOOL, Option::LEVEL_DEV)
4766 	    .set_default(false)
4767 	    .set_description("Try to submit metadata transaction to rocksdb in queuing thread context"),
4768 	
4769 	    Option("bluestore_fsck_read_bytes_cap", Option::TYPE_SIZE, Option::LEVEL_ADVANCED)
4770 	    .set_default(64_M)
4771 	    .set_flag(Option::FLAG_RUNTIME)
4772 	    .set_description("Maximum bytes read at once by deep fsck"),
4773 	
4774 	    Option("bluestore_fsck_quick_fix_threads", Option::TYPE_INT, Option::LEVEL_ADVANCED)
4775 	      .set_default(2)
4776 	      .set_description("Number of additional threads to perform quick-fix (shallow fsck) command"),
4777 	
4778 	    Option("bluestore_throttle_bytes", Option::TYPE_SIZE, Option::LEVEL_ADVANCED)
4779 	    .set_default(64_M)
4780 	    .set_flag(Option::FLAG_RUNTIME)
4781 	    .set_description("Maximum bytes in flight before we throttle IO submission"),
4782 	
4783 	    Option("bluestore_throttle_deferred_bytes", Option::TYPE_SIZE, Option::LEVEL_ADVANCED)
4784 	    .set_default(128_M)
4785 	    .set_flag(Option::FLAG_RUNTIME)
4786 	    .set_description("Maximum bytes for deferred writes before we throttle IO submission"),
4787 	
4788 	    Option("bluestore_throttle_cost_per_io", Option::TYPE_SIZE, Option::LEVEL_ADVANCED)
4789 	    .set_default(0)
4790 	    .set_flag(Option::FLAG_RUNTIME)
4791 	    .set_description("Overhead added to transaction cost (in bytes) for each IO"),
4792 	
4793 	  Option("bluestore_throttle_cost_per_io_hdd", Option::TYPE_UINT, Option::LEVEL_ADVANCED)
4794 	    .set_default(670000)
4795 	    .set_flag(Option::FLAG_RUNTIME)
4796 	    .set_description("Default bluestore_throttle_cost_per_io for rotational media")
4797 	    .add_see_also("bluestore_throttle_cost_per_io"),
4798 	
4799 	    Option("bluestore_throttle_cost_per_io_ssd", Option::TYPE_UINT, Option::LEVEL_ADVANCED)
4800 	    .set_default(4000)
4801 	    .set_flag(Option::FLAG_RUNTIME)
4802 	    .set_description("Default bluestore_throttle_cost_per_io for non-rotation (solid state) media")
4803 	    .add_see_also("bluestore_throttle_cost_per_io"),
4804 	
4805 	    Option("bluestore_deferred_batch_ops", Option::TYPE_UINT, Option::LEVEL_ADVANCED)
4806 	    .set_default(0)
4807 	    .set_flag(Option::FLAG_RUNTIME)
4808 	    .set_description("Max number of deferred writes before we flush the deferred write queue"),
4809 	
4810 	    Option("bluestore_deferred_batch_ops_hdd", Option::TYPE_UINT, Option::LEVEL_ADVANCED)
4811 	    .set_default(64)
4812 	    .set_flag(Option::FLAG_RUNTIME)
4813 	    .set_description("Default bluestore_deferred_batch_ops for rotational media")
4814 	    .add_see_also("bluestore_deferred_batch_ops"),
4815 	
4816 	    Option("bluestore_deferred_batch_ops_ssd", Option::TYPE_UINT, Option::LEVEL_ADVANCED)
4817 	    .set_default(16)
4818 	    .set_flag(Option::FLAG_RUNTIME)
4819 	    .set_description("Default bluestore_deferred_batch_ops for non-rotational (solid state) media")
4820 	    .add_see_also("bluestore_deferred_batch_ops"),
4821 	
4822 	    Option("bluestore_nid_prealloc", Option::TYPE_INT, Option::LEVEL_DEV)
4823 	    .set_default(1024)
4824 	    .set_description("Number of unique object ids to preallocate at a time"),
4825 	
4826 	    Option("bluestore_blobid_prealloc", Option::TYPE_UINT, Option::LEVEL_DEV)
4827 	    .set_default(10240)
4828 	    .set_description("Number of unique blob ids to preallocate at a time"),
4829 	
4830 	    Option("bluestore_clone_cow", Option::TYPE_BOOL, Option::LEVEL_ADVANCED)
4831 	    .set_default(true)
4832 	    .set_flag(Option::FLAG_RUNTIME)
4833 	    .set_description("Use copy-on-write when cloning objects (versus reading and rewriting them at clone time)"),
4834 	
4835 	    Option("bluestore_default_buffered_read", Option::TYPE_BOOL, Option::LEVEL_ADVANCED)
4836 	    .set_default(true)
4837 	    .set_flag(Option::FLAG_RUNTIME)
4838 	    .set_description("Cache read results by default (unless hinted NOCACHE or WONTNEED)"),
4839 	
4840 	    Option("bluestore_default_buffered_write", Option::TYPE_BOOL, Option::LEVEL_ADVANCED)
4841 	    .set_default(false)
4842 	    .set_flag(Option::FLAG_RUNTIME)
4843 	    .set_description("Cache writes by default (unless hinted NOCACHE or WONTNEED)"),
4844 	
4845 	    Option("bluestore_debug_misc", Option::TYPE_BOOL, Option::LEVEL_DEV)
4846 	    .set_default(false)
4847 	    .set_description(""),
4848 	
4849 	    Option("bluestore_debug_no_reuse_blocks", Option::TYPE_BOOL, Option::LEVEL_DEV)
4850 	    .set_default(false)
4851 	    .set_description(""),
4852 	
4853 	    Option("bluestore_debug_small_allocations", Option::TYPE_INT, Option::LEVEL_DEV)
4854 	    .set_default(0)
4855 	    .set_description(""),
4856 	
4857 	    Option("bluestore_debug_too_many_blobs_threshold", Option::TYPE_INT, Option::LEVEL_DEV)
4858 	    .set_default(24*1024)
4859 	    .set_description(""),
4860 	
4861 	    Option("bluestore_debug_freelist", Option::TYPE_BOOL, Option::LEVEL_DEV)
4862 	    .set_default(false)
4863 	    .set_description(""),
4864 	
4865 	    Option("bluestore_debug_prefill", Option::TYPE_FLOAT, Option::LEVEL_DEV)
4866 	    .set_default(0)
4867 	    .set_description("simulate fragmentation"),
4868 	
4869 	    Option("bluestore_debug_prefragment_max", Option::TYPE_SIZE, Option::LEVEL_DEV)
4870 	    .set_default(1_M)
4871 	    .set_description(""),
4872 	
4873 	    Option("bluestore_debug_inject_read_err", Option::TYPE_BOOL, Option::LEVEL_DEV)
4874 	    .set_default(false)
4875 	    .set_description(""),
4876 	
4877 	    Option("bluestore_debug_randomize_serial_transaction", Option::TYPE_INT, Option::LEVEL_DEV)
4878 	    .set_default(0)
4879 	    .set_description(""),
4880 	
4881 	    Option("bluestore_debug_omit_block_device_write", Option::TYPE_BOOL, Option::LEVEL_DEV)
4882 	    .set_default(false)
4883 	    .set_description(""),
4884 	
4885 	    Option("bluestore_debug_fsck_abort", Option::TYPE_BOOL, Option::LEVEL_DEV)
4886 	    .set_default(false)
4887 	    .set_description(""),
4888 	
4889 	    Option("bluestore_debug_omit_kv_commit", Option::TYPE_BOOL, Option::LEVEL_DEV)
4890 	    .set_default(false)
4891 	    .set_description(""),
4892 	
4893 	    Option("bluestore_debug_permit_any_bdev_label", Option::TYPE_BOOL, Option::LEVEL_DEV)
4894 	    .set_default(false)
4895 	    .set_description(""),
4896 	
4897 	    Option("bluestore_debug_random_read_err", Option::TYPE_FLOAT, Option::LEVEL_DEV)
4898 	    .set_default(0)
4899 	    .set_description(""),
4900 	
4901 	    Option("bluestore_debug_inject_bug21040", Option::TYPE_BOOL, Option::LEVEL_DEV)
4902 	    .set_default(false)
4903 	    .set_description(""),
4904 	
4905 	    Option("bluestore_debug_inject_csum_err_probability", Option::TYPE_FLOAT, Option::LEVEL_DEV)
4906 	    .set_default(0.0)
4907 	    .set_description("inject crc verification errors into bluestore device reads"),
4908 	
4909 	    Option("bluestore_fsck_error_on_no_per_pool_stats", Option::TYPE_BOOL, Option::LEVEL_ADVANCED)
4910 	    .set_default(false)
4911 	    .set_description("Make fsck error (instead of warn) when bluestore lacks per-pool stats, e.g., after an upgrade"),
4912 	
4913 	    Option("bluestore_warn_on_bluefs_spillover", Option::TYPE_BOOL, Option::LEVEL_ADVANCED)
4914 	    .set_default(true)
4915 	    .set_description("Enable health indication on bluefs slow device usage"),
4916 	
4917 	    Option("bluestore_warn_on_legacy_statfs", Option::TYPE_BOOL, Option::LEVEL_ADVANCED)
4918 	    .set_default(true)
4919 	    .set_description("Enable health indication on lack of per-pool statfs reporting from bluestore"),
4920 	
4921 	    Option("bluestore_fsck_error_on_no_per_pool_omap", Option::TYPE_BOOL, Option::LEVEL_ADVANCED)
4922 	    .set_default(false)
4923 	    .set_description("Make fsck error (instead of warn) when objects without per-pool omap are found"),
4924 	
4925 	    Option("bluestore_warn_on_no_per_pool_omap", Option::TYPE_BOOL, Option::LEVEL_ADVANCED)
4926 	    .set_default(true)
4927 	    .set_description("Enable health indication on lack of per-pool omap"),
4928 	
4929 	    Option("bluestore_log_op_age", Option::TYPE_FLOAT, Option::LEVEL_ADVANCED)
4930 	    .set_default(5)
4931 	    .set_description("log operation if it's slower than this age (seconds)"),
4932 	
4933 	    Option("bluestore_log_omap_iterator_age", Option::TYPE_FLOAT, Option::LEVEL_ADVANCED)
4934 	    .set_default(5)
4935 	    .set_description("log omap iteration operation if it's slower than this age (seconds)"),
4936 	
4937 	    Option("bluestore_log_collection_list_age", Option::TYPE_FLOAT, Option::LEVEL_ADVANCED)
4938 	    .set_default(60)
4939 	    .set_description("log collection list operation if it's slower than this age (seconds)"),
4940 	
4941 	    Option("bluestore_debug_enforce_settings", Option::TYPE_STR, Option::LEVEL_DEV)
4942 	    .set_default("default")
4943 	    .set_enum_allowed({"default", "hdd", "ssd"})
4944 	    .set_description("Enforces specific hw profile settings")
4945 	    .set_long_description("'hdd' enforces settings intended for BlueStore above a rotational drive. 'ssd' enforces settings intended for BlueStore above a solid drive. 'default' - using settings for the actual hardware."),
4946 	
4947 	
4948 	    // -----------------------------------------
4949 	    // kstore
4950 	
4951 	    Option("kstore_max_ops", Option::TYPE_UINT, Option::LEVEL_ADVANCED)
4952 	    .set_default(512)
4953 	    .set_description(""),
4954 	
4955 	    Option("kstore_max_bytes", Option::TYPE_SIZE, Option::LEVEL_ADVANCED)
4956 	    .set_default(64_M)
4957 	    .set_description(""),
4958 	
4959 	    Option("kstore_backend", Option::TYPE_STR, Option::LEVEL_ADVANCED)
4960 	    .set_default("rocksdb")
4961 	    .set_description(""),
4962 	
4963 	    Option("kstore_rocksdb_options", Option::TYPE_STR, Option::LEVEL_ADVANCED)
4964 	    .set_default("compression=kNoCompression")
4965 	    .set_description("Options to pass through when RocksDB is used as the KeyValueDB for kstore."),
4966 	
4967 	    Option("kstore_fsck_on_mount", Option::TYPE_BOOL, Option::LEVEL_ADVANCED)
4968 	    .set_default(false)
4969 	    .set_description("Whether or not to run fsck on mount for kstore."),
4970 	
4971 	    Option("kstore_fsck_on_mount_deep", Option::TYPE_BOOL, Option::LEVEL_ADVANCED)
4972 	    .set_default(true)
4973 	    .set_description("Whether or not to run deep fsck on mount for kstore"),
4974 	
4975 	    Option("kstore_nid_prealloc", Option::TYPE_UINT, Option::LEVEL_ADVANCED)
4976 	    .set_default(1024)
4977 	    .set_description(""),
4978 	
4979 	    Option("kstore_sync_transaction", Option::TYPE_BOOL, Option::LEVEL_ADVANCED)
4980 	    .set_default(false)
4981 	    .set_description(""),
4982 	
4983 	    Option("kstore_sync_submit_transaction", Option::TYPE_BOOL, Option::LEVEL_ADVANCED)
4984 	    .set_default(false)
4985 	    .set_description(""),
4986 	
4987 	    Option("kstore_onode_map_size", Option::TYPE_UINT, Option::LEVEL_ADVANCED)
4988 	    .set_default(1024)
4989 	    .set_description(""),
4990 	
4991 	    Option("kstore_default_stripe_size", Option::TYPE_SIZE, Option::LEVEL_ADVANCED)
4992 	    .set_default(65536)
4993 	    .set_description(""),
4994 	
4995 	    // ---------------------
4996 	    // filestore
4997 	
4998 	    Option("filestore_rocksdb_options", Option::TYPE_STR, Option::LEVEL_DEV)
4999 	    .set_default("max_background_jobs=10,compaction_readahead_size=2097152,compression=kNoCompression")
5000 	    .set_description("Options to pass through when RocksDB is used as the KeyValueDB for filestore."),
5001 	
5002 	    Option("filestore_omap_backend", Option::TYPE_STR, Option::LEVEL_DEV)
5003 	    .set_default("rocksdb")
5004 	    .set_enum_allowed({"leveldb", "rocksdb"})
5005 	    .set_description("The KeyValueDB to use for filestore metadata (ie omap)."),
5006 	
5007 	    Option("filestore_omap_backend_path", Option::TYPE_STR, Option::LEVEL_DEV)
5008 	    .set_default("")
5009 	    .set_description("The path where the filestore KeyValueDB should store it's database(s)."),
5010 	
5011 	    Option("filestore_wbthrottle_enable", Option::TYPE_BOOL, Option::LEVEL_ADVANCED)
5012 	    .set_default(true)
5013 	    .set_description("Enabling throttling of operations to backing file system"),
5014 	
5015 	    Option("filestore_wbthrottle_btrfs_bytes_start_flusher", Option::TYPE_SIZE, Option::LEVEL_ADVANCED)
5016 	    .set_default(41943040)
5017 	    .set_description("Start flushing (fsyncing) when this many bytes are written(btrfs)"),
5018 	
5019 	    Option("filestore_wbthrottle_btrfs_bytes_hard_limit", Option::TYPE_SIZE, Option::LEVEL_ADVANCED)
5020 	    .set_default(419430400)
5021 	    .set_description("Block writes when this many bytes haven't been flushed (fsynced) (btrfs)"),
5022 	
5023 	    Option("filestore_wbthrottle_btrfs_ios_start_flusher", Option::TYPE_UINT, Option::LEVEL_ADVANCED)
5024 	    .set_default(500)
5025 	    .set_description("Start flushing (fsyncing) when this many IOs are written (brtrfs)"),
5026 	
5027 	    Option("filestore_wbthrottle_btrfs_ios_hard_limit", Option::TYPE_UINT, Option::LEVEL_ADVANCED)
5028 	    .set_default(5000)
5029 	    .set_description("Block writes when this many IOs haven't been flushed (fsynced) (btrfs)"),
5030 	
5031 	    Option("filestore_wbthrottle_btrfs_inodes_start_flusher", Option::TYPE_UINT, Option::LEVEL_ADVANCED)
5032 	    .set_default(500)
5033 	    .set_description("Start flushing (fsyncing) when this many distinct inodes have been modified (btrfs)"),
5034 	
5035 	    Option("filestore_wbthrottle_xfs_bytes_start_flusher", Option::TYPE_SIZE, Option::LEVEL_ADVANCED)
5036 	    .set_default(41943040)
5037 	    .set_description("Start flushing (fsyncing) when this many bytes are written(xfs)"),
5038 	
5039 	    Option("filestore_wbthrottle_xfs_bytes_hard_limit", Option::TYPE_SIZE, Option::LEVEL_ADVANCED)
5040 	    .set_default(419430400)
5041 	    .set_description("Block writes when this many bytes haven't been flushed (fsynced) (xfs)"),
5042 	
5043 	    Option("filestore_wbthrottle_xfs_ios_start_flusher", Option::TYPE_UINT, Option::LEVEL_ADVANCED)
5044 	    .set_default(500)
5045 	    .set_description("Start flushing (fsyncing) when this many IOs are written (xfs)"),
5046 	
5047 	    Option("filestore_wbthrottle_xfs_ios_hard_limit", Option::TYPE_UINT, Option::LEVEL_ADVANCED)
5048 	    .set_default(5000)
5049 	    .set_description("Block writes when this many IOs haven't been flushed (fsynced) (xfs)"),
5050 	
5051 	    Option("filestore_wbthrottle_xfs_inodes_start_flusher", Option::TYPE_UINT, Option::LEVEL_ADVANCED)
5052 	    .set_default(500)
5053 	    .set_description("Start flushing (fsyncing) when this many distinct inodes have been modified (xfs)"),
5054 	
5055 	    Option("filestore_wbthrottle_btrfs_inodes_hard_limit", Option::TYPE_UINT, Option::LEVEL_ADVANCED)
5056 	    .set_default(5000)
5057 	    .set_description("Block writing when this many inodes have outstanding writes (btrfs)"),
5058 	
5059 	    Option("filestore_wbthrottle_xfs_inodes_hard_limit", Option::TYPE_UINT, Option::LEVEL_ADVANCED)
5060 	    .set_default(5000)
5061 	    .set_description("Block writing when this many inodes have outstanding writes (xfs)"),
5062 	
5063 	    Option("filestore_odsync_write", Option::TYPE_BOOL, Option::LEVEL_DEV)
5064 	    .set_default(false)
5065 	    .set_description("Write with O_DSYNC"),
5066 	
5067 	    Option("filestore_index_retry_probability", Option::TYPE_FLOAT, Option::LEVEL_DEV)
5068 	    .set_default(0)
5069 	    .set_description(""),
5070 	
5071 	    Option("filestore_debug_inject_read_err", Option::TYPE_BOOL, Option::LEVEL_DEV)
5072 	    .set_default(false)
5073 	    .set_description(""),
5074 	
5075 	    Option("filestore_debug_random_read_err", Option::TYPE_FLOAT, Option::LEVEL_DEV)
5076 	    .set_default(0)
5077 	    .set_description(""),
5078 	
5079 	    Option("filestore_debug_omap_check", Option::TYPE_BOOL, Option::LEVEL_DEV)
5080 	    .set_default(false)
5081 	    .set_description(""),
5082 	
5083 	    Option("filestore_omap_header_cache_size", Option::TYPE_SIZE, Option::LEVEL_DEV)
5084 	    .set_default(1024)
5085 	    .set_description(""),
5086 	
5087 	    Option("filestore_max_inline_xattr_size", Option::TYPE_SIZE, Option::LEVEL_DEV)
5088 	    .set_default(0)
5089 	    .set_description(""),
5090 	
5091 	    Option("filestore_max_inline_xattr_size_xfs", Option::TYPE_SIZE, Option::LEVEL_DEV)
5092 	    .set_default(65536)
5093 	    .set_description(""),
5094 	
5095 	    Option("filestore_max_inline_xattr_size_btrfs", Option::TYPE_SIZE, Option::LEVEL_DEV)
5096 	    .set_default(2048)
5097 	    .set_description(""),
5098 	
5099 	    Option("filestore_max_inline_xattr_size_other", Option::TYPE_SIZE, Option::LEVEL_DEV)
5100 	    .set_default(512)
5101 	    .set_description(""),
5102 	
5103 	    Option("filestore_max_inline_xattrs", Option::TYPE_UINT, Option::LEVEL_DEV)
5104 	    .set_default(0)
5105 	    .set_description(""),
5106 	
5107 	    Option("filestore_max_inline_xattrs_xfs", Option::TYPE_UINT, Option::LEVEL_DEV)
5108 	    .set_default(10)
5109 	    .set_description(""),
5110 	
5111 	    Option("filestore_max_inline_xattrs_btrfs", Option::TYPE_UINT, Option::LEVEL_DEV)
5112 	    .set_default(10)
5113 	    .set_description(""),
5114 	
5115 	    Option("filestore_max_inline_xattrs_other", Option::TYPE_UINT, Option::LEVEL_DEV)
5116 	    .set_default(2)
5117 	    .set_description(""),
5118 	
5119 	    Option("filestore_max_xattr_value_size", Option::TYPE_SIZE, Option::LEVEL_DEV)
5120 	    .set_default(0)
5121 	    .set_description(""),
5122 	
5123 	    Option("filestore_max_xattr_value_size_xfs", Option::TYPE_SIZE, Option::LEVEL_DEV)
5124 	    .set_default(64_K)
5125 	    .set_description(""),
5126 	
5127 	    Option("filestore_max_xattr_value_size_btrfs", Option::TYPE_SIZE, Option::LEVEL_DEV)
5128 	    .set_default(64_K)
5129 	    .set_description(""),
5130 	
5131 	    Option("filestore_max_xattr_value_size_other", Option::TYPE_SIZE, Option::LEVEL_DEV)
5132 	    .set_default(1_K)
5133 	    .set_description(""),
5134 	
5135 	    Option("filestore_sloppy_crc", Option::TYPE_BOOL, Option::LEVEL_DEV)
5136 	    .set_default(false)
5137 	    .set_description(""),
5138 	
5139 	    Option("filestore_sloppy_crc_block_size", Option::TYPE_SIZE, Option::LEVEL_DEV)
5140 	    .set_default(65536)
5141 	    .set_description(""),
5142 	
5143 	    Option("filestore_max_alloc_hint_size", Option::TYPE_SIZE, Option::LEVEL_DEV)
5144 	    .set_default(1ULL << 20)
5145 	    .set_description(""),
5146 	
5147 	    Option("filestore_max_sync_interval", Option::TYPE_FLOAT, Option::LEVEL_ADVANCED)
5148 	    .set_default(5)
5149 	    .set_description("Period between calls to syncfs(2) and journal trims (seconds)"),
5150 	
5151 	    Option("filestore_min_sync_interval", Option::TYPE_FLOAT, Option::LEVEL_DEV)
5152 	    .set_default(.01)
5153 	    .set_description("Minimum period between calls to syncfs(2)"),
5154 	
5155 	    Option("filestore_btrfs_snap", Option::TYPE_BOOL, Option::LEVEL_DEV)
5156 	    .set_default(true)
5157 	    .set_description(""),
5158 	
5159 	    Option("filestore_btrfs_clone_range", Option::TYPE_BOOL, Option::LEVEL_ADVANCED)
5160 	    .set_default(true)
5161 	    .set_description("Use btrfs clone_range ioctl to efficiently duplicate objects"),
5162 	
5163 	    Option("filestore_zfs_snap", Option::TYPE_BOOL, Option::LEVEL_DEV)
5164 	    .set_default(false)
5165 	    .set_description(""),
5166 	
5167 	    Option("filestore_fsync_flushes_journal_data", Option::TYPE_BOOL, Option::LEVEL_DEV)
5168 	    .set_default(false)
5169 	    .set_description(""),
5170 	
5171 	    Option("filestore_fiemap", Option::TYPE_BOOL, Option::LEVEL_ADVANCED)
5172 	    .set_default(false)
5173 	    .set_description("Use fiemap ioctl(2) to determine which parts of objects are sparse"),
5174 	
5175 	    Option("filestore_punch_hole", Option::TYPE_BOOL, Option::LEVEL_ADVANCED)
5176 	    .set_default(false)
5177 	    .set_description("Use fallocate(2) FALLOC_FL_PUNCH_HOLE to efficiently zero ranges of objects"),
5178 	
5179 	    Option("filestore_seek_data_hole", Option::TYPE_BOOL, Option::LEVEL_ADVANCED)
5180 	    .set_default(false)
5181 	    .set_description("Use lseek(2) SEEK_HOLE and SEEK_DATA to determine which parts of objects are sparse"),
5182 	
5183 	    Option("filestore_splice", Option::TYPE_BOOL, Option::LEVEL_ADVANCED)
5184 	    .set_default(false)
5185 	    .set_description("Use splice(2) to more efficiently copy data between files"),
5186 	
5187 	    Option("filestore_fadvise", Option::TYPE_BOOL, Option::LEVEL_ADVANCED)
5188 	    .set_default(true)
5189 	    .set_description("Use posix_fadvise(2) to pass hints to file system"),
5190 	
5191 	    Option("filestore_collect_device_partition_information", Option::TYPE_BOOL, Option::LEVEL_ADVANCED)
5192 	    .set_default(true)
5193 	    .set_description("Collect metadata about the backing file system on OSD startup"),
5194 	
5195 	    Option("filestore_xfs_extsize", Option::TYPE_BOOL, Option::LEVEL_ADVANCED)
5196 	    .set_default(false)
5197 	    .set_description("Use XFS extsize ioctl(2) to hint allocator about expected write sizes"),
5198 	
5199 	    Option("filestore_journal_parallel", Option::TYPE_BOOL, Option::LEVEL_DEV)
5200 	    .set_default(false)
5201 	    .set_description(""),
5202 	
5203 	    Option("filestore_journal_writeahead", Option::TYPE_BOOL, Option::LEVEL_DEV)
5204 	    .set_default(false)
5205 	    .set_description(""),
5206 	
5207 	    Option("filestore_journal_trailing", Option::TYPE_BOOL, Option::LEVEL_DEV)
5208 	    .set_default(false)
5209 	    .set_description(""),
5210 	
5211 	    Option("filestore_queue_max_ops", Option::TYPE_UINT, Option::LEVEL_ADVANCED)
5212 	    .set_default(50)
5213 	    .set_description("Max IO operations in flight"),
5214 	
5215 	    Option("filestore_queue_max_bytes", Option::TYPE_SIZE, Option::LEVEL_ADVANCED)
5216 	    .set_default(100_M)
5217 	    .set_description("Max (written) bytes in flight"),
5218 	
5219 	    Option("filestore_caller_concurrency", Option::TYPE_INT, Option::LEVEL_DEV)
5220 	    .set_default(10)
5221 	    .set_description(""),
5222 	
5223 	    Option("filestore_expected_throughput_bytes", Option::TYPE_FLOAT, Option::LEVEL_ADVANCED)
5224 	    .set_default(200_M)
5225 	    .set_description("Expected throughput of backend device (aids throttling calculations)"),
5226 	
5227 	    Option("filestore_expected_throughput_ops", Option::TYPE_FLOAT, Option::LEVEL_ADVANCED)
5228 	    .set_default(200)
5229 	    .set_description("Expected through of backend device in IOPS (aids throttling calculations)"),
5230 	
5231 	    Option("filestore_queue_max_delay_multiple", Option::TYPE_FLOAT, Option::LEVEL_DEV)
5232 	    .set_default(0)
5233 	    .set_description(""),
5234 	
5235 	    Option("filestore_queue_high_delay_multiple", Option::TYPE_FLOAT, Option::LEVEL_DEV)
5236 	    .set_default(0)
5237 	    .set_description(""),
5238 	
5239 	    Option("filestore_queue_max_delay_multiple_bytes", Option::TYPE_FLOAT, Option::LEVEL_DEV)
5240 	    .set_default(0)
5241 	    .set_description(""),
5242 	
5243 	    Option("filestore_queue_high_delay_multiple_bytes", Option::TYPE_FLOAT, Option::LEVEL_DEV)
5244 	    .set_default(0)
5245 	    .set_description(""),
5246 	
5247 	    Option("filestore_queue_max_delay_multiple_ops", Option::TYPE_FLOAT, Option::LEVEL_DEV)
5248 	    .set_default(0)
5249 	    .set_description(""),
5250 	
5251 	    Option("filestore_queue_high_delay_multiple_ops", Option::TYPE_FLOAT, Option::LEVEL_DEV)
5252 	    .set_default(0)
5253 	    .set_description(""),
5254 	
5255 	    Option("filestore_queue_low_threshhold", Option::TYPE_FLOAT, Option::LEVEL_DEV)
5256 	    .set_default(0.3)
5257 	    .set_description(""),
5258 	
5259 	    Option("filestore_queue_high_threshhold", Option::TYPE_FLOAT, Option::LEVEL_DEV)
5260 	    .set_default(0.9)
5261 	    .set_description(""),
5262 	
5263 	    Option("filestore_op_threads", Option::TYPE_INT, Option::LEVEL_ADVANCED)
5264 	    .set_default(2)
5265 	    .set_description("Threads used to apply changes to backing file system"),
5266 	
5267 	    Option("filestore_op_thread_timeout", Option::TYPE_INT, Option::LEVEL_ADVANCED)
5268 	    .set_default(60)
5269 	    .set_description("Seconds before a worker thread is considered stalled"),
5270 	
5271 	    Option("filestore_op_thread_suicide_timeout", Option::TYPE_INT, Option::LEVEL_ADVANCED)
5272 	    .set_default(180)
5273 	    .set_description("Seconds before a worker thread is considered dead"),
5274 	
5275 	    Option("filestore_commit_timeout", Option::TYPE_FLOAT, Option::LEVEL_ADVANCED)
5276 	    .set_default(600)
5277 	    .set_description("Seconds before backing file system is considered hung"),
5278 	
5279 	    Option("filestore_fiemap_threshold", Option::TYPE_SIZE, Option::LEVEL_DEV)
5280 	    .set_default(4_K)
5281 	    .set_description(""),
5282 	
5283 	    Option("filestore_merge_threshold", Option::TYPE_INT, Option::LEVEL_DEV)
5284 	    .set_default(-10)
5285 	    .set_description(""),
5286 	
5287 	    Option("filestore_split_multiple", Option::TYPE_INT, Option::LEVEL_DEV)
5288 	    .set_default(2)
5289 	    .set_description(""),
5290 	
5291 	    Option("filestore_split_rand_factor", Option::TYPE_UINT, Option::LEVEL_DEV)
5292 	    .set_default(20)
5293 	    .set_description(""),
5294 	
5295 	    Option("filestore_update_to", Option::TYPE_INT, Option::LEVEL_DEV)
5296 	    .set_default(1000)
5297 	    .set_description(""),
5298 	
5299 	    Option("filestore_blackhole", Option::TYPE_BOOL, Option::LEVEL_DEV)
5300 	    .set_default(false)
5301 	    .set_description(""),
5302 	
5303 	    Option("filestore_fd_cache_size", Option::TYPE_INT, Option::LEVEL_DEV)
5304 	    .set_default(128)
5305 	    .set_description(""),
5306 	
5307 	    Option("filestore_fd_cache_shards", Option::TYPE_INT, Option::LEVEL_DEV)
5308 	    .set_default(16)
5309 	    .set_description(""),
5310 	
5311 	    Option("filestore_ondisk_finisher_threads", Option::TYPE_INT, Option::LEVEL_DEV)
5312 	    .set_default(1)
5313 	    .set_description(""),
5314 	
5315 	    Option("filestore_apply_finisher_threads", Option::TYPE_INT, Option::LEVEL_DEV)
5316 	    .set_default(1)
5317 	    .set_description(""),
5318 	
5319 	    Option("filestore_dump_file", Option::TYPE_STR, Option::LEVEL_DEV)
5320 	    .set_default("")
5321 	    .set_description(""),
5322 	
5323 	    Option("filestore_kill_at", Option::TYPE_INT, Option::LEVEL_DEV)
5324 	    .set_default(0)
5325 	    .set_description(""),
5326 	
5327 	    Option("filestore_inject_stall", Option::TYPE_INT, Option::LEVEL_DEV)
5328 	    .set_default(0)
5329 	    .set_description(""),
5330 	
5331 	    Option("filestore_fail_eio", Option::TYPE_BOOL, Option::LEVEL_DEV)
5332 	    .set_default(true)
5333 	    .set_description(""),
5334 	
5335 	    Option("filestore_debug_verify_split", Option::TYPE_BOOL, Option::LEVEL_DEV)
5336 	    .set_default(false)
5337 	    .set_description(""),
5338 	
5339 	    Option("journal_dio", Option::TYPE_BOOL, Option::LEVEL_DEV)
5340 	    .set_default(true)
5341 	    .set_description(""),
5342 	
5343 	    Option("journal_aio", Option::TYPE_BOOL, Option::LEVEL_DEV)
5344 	    .set_default(true)
5345 	    .set_description(""),
5346 	
5347 	    Option("journal_force_aio", Option::TYPE_BOOL, Option::LEVEL_DEV)
5348 	    .set_default(false)
5349 	    .set_description(""),
5350 	
5351 	    Option("journal_block_size", Option::TYPE_SIZE, Option::LEVEL_DEV)
5352 	    .set_default(4_K)
5353 	    .set_description(""),
5354 	
5355 	    Option("journal_block_align", Option::TYPE_BOOL, Option::LEVEL_DEV)
5356 	    .set_default(true)
5357 	    .set_description(""),
5358 	
5359 	    Option("journal_write_header_frequency", Option::TYPE_UINT, Option::LEVEL_DEV)
5360 	    .set_default(0)
5361 	    .set_description(""),
5362 	
5363 	    Option("journal_max_write_bytes", Option::TYPE_SIZE, Option::LEVEL_ADVANCED)
5364 	    .set_default(10_M)
5365 	    .set_description("Max bytes in flight to journal"),
5366 	
5367 	    Option("journal_max_write_entries", Option::TYPE_INT, Option::LEVEL_ADVANCED)
5368 	    .set_default(100)
5369 	    .set_description("Max IOs in flight to journal"),
5370 	
5371 	    Option("journal_throttle_low_threshhold", Option::TYPE_FLOAT, Option::LEVEL_DEV)
5372 	    .set_default(0.6)
5373 	    .set_description(""),
5374 	
5375 	    Option("journal_throttle_high_threshhold", Option::TYPE_FLOAT, Option::LEVEL_DEV)
5376 	    .set_default(0.9)
5377 	    .set_description(""),
5378 	
5379 	    Option("journal_throttle_high_multiple", Option::TYPE_FLOAT, Option::LEVEL_DEV)
5380 	    .set_default(0)
5381 	    .set_description(""),
5382 	
5383 	    Option("journal_throttle_max_multiple", Option::TYPE_FLOAT, Option::LEVEL_DEV)
5384 	    .set_default(0)
5385 	    .set_description(""),
5386 	
5387 	    Option("journal_align_min_size", Option::TYPE_SIZE, Option::LEVEL_DEV)
5388 	    .set_default(64_K)
5389 	    .set_description(""),
5390 	
5391 	    Option("journal_replay_from", Option::TYPE_INT, Option::LEVEL_DEV)
5392 	    .set_default(0)
5393 	    .set_description(""),
5394 	
5395 	    Option("mgr_stats_threshold", Option::TYPE_INT, Option::LEVEL_ADVANCED)
5396 	    .set_default((int64_t)PerfCountersBuilder::PRIO_USEFUL)
5397 	    .set_description("Lowest perfcounter priority collected by mgr")
5398 	    .set_long_description("Daemons only set perf counter data to the manager "
5399 				  "daemon if the counter has a priority higher than this.")
5400 	    .set_min_max((int64_t)PerfCountersBuilder::PRIO_DEBUGONLY,
5401 			 (int64_t)PerfCountersBuilder::PRIO_CRITICAL + 1),
5402 	
5403 	    Option("journal_zero_on_create", Option::TYPE_BOOL, Option::LEVEL_DEV)
5404 	    .set_default(false)
5405 	    .set_description(""),
5406 	
5407 	    Option("journal_ignore_corruption", Option::TYPE_BOOL, Option::LEVEL_DEV)
5408 	    .set_default(false)
5409 	    .set_description(""),
5410 	
5411 	    Option("journal_discard", Option::TYPE_BOOL, Option::LEVEL_DEV)
5412 	    .set_default(false)
5413 	    .set_description(""),
5414 	
5415 	    Option("fio_dir", Option::TYPE_STR, Option::LEVEL_ADVANCED)
5416 	    .set_default("/tmp/fio")
5417 	    .set_description(""),
5418 	
5419 	    Option("rados_mon_op_timeout", Option::TYPE_FLOAT, Option::LEVEL_ADVANCED)
5420 	    .set_default(0)
5421 	    .set_description(""),
5422 	
5423 	    Option("rados_osd_op_timeout", Option::TYPE_FLOAT, Option::LEVEL_ADVANCED)
5424 	    .set_default(0)
5425 	    .set_description(""),
5426 	
5427 	    Option("rados_tracing", Option::TYPE_BOOL, Option::LEVEL_ADVANCED)
5428 	    .set_default(false)
5429 	    .set_description(""),
5430 	
5431 	    Option("ceph_daemon_path", Option::TYPE_STR, Option::LEVEL_ADVANCED)
5432 	    .set_default("/usr/sbin/ceph-daemon")
5433 	    .add_service("mgr")
5434 	    .set_description("Path to ceph-daemon utility"),
5435 	
5436 	    Option("mgr_module_path", Option::TYPE_STR, Option::LEVEL_ADVANCED)
5437 	    .set_default(CEPH_DATADIR "/mgr")
5438 	    .add_service("mgr")
5439 	    .set_description("Filesystem path to manager modules."),
5440 	
5441 	    Option("mgr_initial_modules", Option::TYPE_STR, Option::LEVEL_BASIC)
5442 	    .set_default("restful iostat")
5443 	    .set_flag(Option::FLAG_NO_MON_UPDATE)
5444 	    .set_flag(Option::FLAG_CLUSTER_CREATE)
5445 	    .add_service("mon")
5446 	    .set_description("List of manager modules to enable when the cluster is "
5447 	                     "first started")
5448 	    .set_long_description("This list of module names is read by the monitor "
5449 	        "when the cluster is first started after installation, to populate "
5450 	        "the list of enabled manager modules.  Subsequent updates are done using "
5451 	        "the 'mgr module [enable|disable]' commands.  List may be comma "
5452 	        "or space separated."),
5453 	
5454 	    Option("mgr_data", Option::TYPE_STR, Option::LEVEL_ADVANCED)
5455 	    .set_default("/var/lib/ceph/mgr/$cluster-$id")
5456 	    .set_flag(Option::FLAG_NO_MON_UPDATE)
5457 	    .add_service("mgr")
5458 	    .set_description("Filesystem path to the ceph-mgr data directory, used to "
5459 	                     "contain keyring."),
5460 	
5461 	    Option("mgr_tick_period", Option::TYPE_SECS, Option::LEVEL_ADVANCED)
5462 	    .set_default(2)
5463 	    .add_service("mgr")
5464 	    .set_description("Period in seconds of beacon messages to monitor"),
5465 	
5466 	    Option("mgr_stats_period", Option::TYPE_INT, Option::LEVEL_BASIC)
5467 	    .set_default(5)
5468 	    .add_service("mgr")
5469 	    .set_description("Period in seconds of OSD/MDS stats reports to manager")
5470 	    .set_long_description("Use this setting to control the granularity of "
5471 	                          "time series data collection from daemons.  Adjust "
5472 	                          "upwards if the manager CPU load is too high, or "
5473 	                          "if you simply do not require the most up to date "
5474 	                          "performance counter data."),
5475 	
5476 	    Option("mgr_client_bytes", Option::TYPE_SIZE, Option::LEVEL_DEV)
5477 	    .set_default(128_M)
5478 	    .add_service("mgr"),
5479 	
5480 	    Option("mgr_client_messages", Option::TYPE_UINT, Option::LEVEL_DEV)
5481 	    .set_default(512)
5482 	    .add_service("mgr"),
5483 	
5484 	    Option("mgr_osd_bytes", Option::TYPE_SIZE, Option::LEVEL_DEV)
5485 	    .set_default(512_M)
5486 	    .add_service("mgr"),
5487 	
5488 	    Option("mgr_osd_messages", Option::TYPE_UINT, Option::LEVEL_DEV)
5489 	    .set_default(8192)
5490 	    .add_service("mgr"),
5491 	
5492 	    Option("mgr_mds_bytes", Option::TYPE_SIZE, Option::LEVEL_DEV)
5493 	    .set_default(128_M)
5494 	    .add_service("mgr"),
5495 	
5496 	    Option("mgr_mds_messages", Option::TYPE_UINT, Option::LEVEL_DEV)
5497 	    .set_default(128)
5498 	    .add_service("mgr"),
5499 	
5500 	    Option("mgr_mon_bytes", Option::TYPE_SIZE, Option::LEVEL_DEV)
5501 	    .set_default(128_M)
5502 	    .add_service("mgr"),
5503 	
5504 	    Option("mgr_mon_messages", Option::TYPE_UINT, Option::LEVEL_DEV)
5505 	    .set_default(128)
5506 	    .add_service("mgr"),
5507 	
5508 	    Option("mgr_connect_retry_interval", Option::TYPE_FLOAT, Option::LEVEL_DEV)
5509 	    .set_default(1.0)
5510 	    .add_service("common"),
5511 	
5512 	    Option("mgr_service_beacon_grace", Option::TYPE_FLOAT, Option::LEVEL_ADVANCED)
5513 	    .set_default(60.0)
5514 	    .add_service("mgr")
5515 	    .set_description("Period in seconds from last beacon to manager dropping "
5516 	                     "state about a monitored service (RGW, rbd-mirror etc)"),
5517 	
5518 	    Option("mgr_client_service_daemon_unregister_timeout", Option::TYPE_FLOAT, Option::LEVEL_DEV)
5519 	    .set_default(1.0)
5520 	    .set_description("Time to wait during shutdown to deregister service with mgr"),
5521 	
5522 	    Option("mgr_debug_aggressive_pg_num_changes", Option::TYPE_BOOL, Option::LEVEL_DEV)
5523 	    .set_default(false)
5524 	    .set_description("Bypass most throttling and safety checks in pg[p]_num controller")
5525 	    .add_service("mgr"),
5526 	
5527 	    Option("mon_mgr_digest_period", Option::TYPE_INT, Option::LEVEL_DEV)
5528 	    .set_default(5)
5529 	    .add_service("mon")
5530 	    .set_description("Period in seconds between monitor-to-manager "
5531 	                     "health/status updates"),
5532 	
5533 	    Option("mon_mgr_beacon_grace", Option::TYPE_SECS, Option::LEVEL_ADVANCED)
5534 	    .set_default(30)
5535 	    .add_service("mon")
5536 	    .set_description("Period in seconds from last beacon to monitor marking "
5537 	                     "a manager daemon as failed"),
5538 	
5539 	    Option("mon_mgr_inactive_grace", Option::TYPE_INT, Option::LEVEL_ADVANCED)
5540 	    .set_default(60)
5541 	    .add_service("mon")
5542 	    .set_description("Period in seconds after cluster creation during which "
5543 	                     "cluster may have no active manager")
5544 	    .set_long_description("This grace period enables the cluster to come "
5545 	                          "up cleanly without raising spurious health check "
5546 	                          "failures about managers that aren't online yet"),
5547 	
5548 	    Option("mon_mgr_mkfs_grace", Option::TYPE_INT, Option::LEVEL_ADVANCED)
5549 	    .set_default(120)
5550 	    .add_service("mon")
5551 	    .set_description("Period in seconds that the cluster may have no active "
5552 	                     "manager before this is reported as an ERR rather than "
5553 	                     "a WARN"),
5554 	
5555 	    Option("throttler_perf_counter", Option::TYPE_BOOL, Option::LEVEL_ADVANCED)
5556 	    .set_default(true)
5557 	    .set_description(""),
5558 	
5559 	    Option("event_tracing", Option::TYPE_BOOL, Option::LEVEL_ADVANCED)
5560 	    .set_default(false)
5561 	    .set_description(""),
5562 	
5563 	    Option("bluestore_tracing", Option::TYPE_BOOL, Option::LEVEL_ADVANCED)
5564 	    .set_default(false)
5565 	    .set_description("Enable bluestore event tracing."),
5566 	
5567 	    Option("bluestore_throttle_trace_rate", Option::TYPE_FLOAT, Option::LEVEL_ADVANCED)
5568 	    .set_default(0)
5569 	    .set_description("Rate at which to sample bluestore transactions (per second)"),
5570 	
5571 	    Option("debug_deliberately_leak_memory", Option::TYPE_BOOL, Option::LEVEL_DEV)
5572 	    .set_default(false)
5573 	    .set_description(""),
5574 	
5575 	    Option("debug_asserts_on_shutdown", Option::TYPE_BOOL,Option::LEVEL_DEV)
5576 	    .set_default(false)
5577 	    .set_description("Enable certain asserts to check for refcounting bugs on shutdown; see http://tracker.ceph.com/issues/21738"),
5578 	
5579 	    Option("debug_asok_assert_abort", Option::TYPE_BOOL, Option::LEVEL_DEV)
5580 	    .set_default(false)
5581 	    .set_description("allow commands 'assert' and 'abort' via asok for testing crash dumps etc"),
5582 	
5583 	    Option("target_max_misplaced_ratio", Option::TYPE_FLOAT, Option::LEVEL_BASIC)
5584 	    .set_default(.05)
5585 	    .set_description("Max ratio of misplaced objects to target when throttling data rebalancing activity"),
5586 	
5587 	    Option("device_failure_prediction_mode", Option::TYPE_STR, Option::LEVEL_BASIC)
5588 	    .set_default("none")
5589 	    .set_flag(Option::FLAG_RUNTIME)
5590 	    .set_enum_allowed({"none", "local", "cloud"})
5591 	    .set_description("Method used to predict device failures")
5592 	    .set_long_description("To disable prediction, use 'none',  'local' uses a prediction model that runs inside the mgr daemon.  'cloud' will share metrics with a cloud service and query the service for devicelife expectancy."),
5593 	
5594 	    /*  KRB Authentication. */
5595 	    Option("gss_ktab_client_file", Option::TYPE_STR, Option::LEVEL_ADVANCED)
5596 	    .set_default("/var/lib/ceph/$name/gss_client_$name.ktab")
5597 	    .set_description("GSS/KRB5 Keytab file for client authentication")
5598 	    .add_service({"mon", "osd"})
5599 	    .set_long_description("This sets the full path for the GSS/Kerberos client keytab file location."),
5600 	
5601 	    Option("gss_target_name", Option::TYPE_STR, Option::LEVEL_ADVANCED)
5602 	    .set_default("ceph")
5603 	    .set_description("")
5604 	    .add_service({"mon", "osd"})
5605 	    .set_long_description("This sets the gss target service name."),
5606 	
5607 	    Option("debug_disable_randomized_ping", Option::TYPE_BOOL, Option::LEVEL_DEV)
5608 	    .set_default(false)
5609 	    .set_description("Disable heartbeat ping randomization for testing purposes"),
5610 	
5611 	    Option("debug_heartbeat_testing_span", Option::TYPE_INT, Option::LEVEL_DEV)
5612 	    .set_default(0)
5613 	    .set_description("Override 60 second periods for testing only"),
5614 	  });
5615 	}
5616 	
5617 	std::vector<Option> get_rgw_options() {
5618 	  return std::vector<Option>({
5619 	    Option("rgw_acl_grants_max_num", Option::TYPE_INT, Option::LEVEL_ADVANCED)
5620 	    .set_default(100)
5621 	    .set_description("Max number of ACL grants in a single request"),
5622 	
5623 	    Option("rgw_cors_rules_max_num", Option::TYPE_INT, Option::LEVEL_ADVANCED)
5624 	    .set_default(100)
5625 	    .set_description("Max number of cors rules in a single request"),
5626 	
5627 	    Option("rgw_delete_multi_obj_max_num", Option::TYPE_INT, Option::LEVEL_ADVANCED)
5628 	    .set_default(1000)
5629 	    .set_description("Max number of objects in a single multi-object delete request"),
5630 	
5631 	    Option("rgw_website_routing_rules_max_num", Option::TYPE_INT, Option::LEVEL_ADVANCED)
5632 	    .set_default(50)
5633 	    .set_description("Max number of website routing rules in a single request"),
5634 	
5635 	    Option("rgw_rados_tracing", Option::TYPE_BOOL, Option::LEVEL_ADVANCED)
5636 	    .set_default(false)
5637 	    .set_description("true if LTTng-UST tracepoints should be enabled"),
5638 	
5639 	    Option("rgw_op_tracing", Option::TYPE_BOOL, Option::LEVEL_ADVANCED)
5640 	    .set_default(false)
5641 	    .set_description("true if LTTng-UST tracepoints should be enabled"),
5642 	
5643 	    Option("rgw_max_chunk_size", Option::TYPE_SIZE, Option::LEVEL_ADVANCED)
5644 	    .set_default(4_M)
5645 	    .set_description("Set RGW max chunk size")
5646 	    .set_long_description(
5647 	        "The chunk size is the size of RADOS I/O requests that RGW sends when accessing "
5648 	        "data objects. RGW read and write operation will never request more than this amount "
5649 	        "in a single request. This also defines the rgw object head size, as head operations "
5650 	        "need to be atomic, and anything larger than this would require more than a single "
5651 	        "operation."),
5652 	
5653 	    Option("rgw_put_obj_min_window_size", Option::TYPE_SIZE, Option::LEVEL_ADVANCED)
5654 	    .set_default(16_M)
5655 	    .set_description("The minimum RADOS write window size (in bytes).")
5656 	    .set_long_description(
5657 	        "The window size determines the total concurrent RADOS writes of a single rgw object. "
5658 	        "When writing an object RGW will send multiple chunks to RADOS. The total size of the "
5659 	        "writes does not exceed the window size. The window size can be automatically "
5660 	        "in order to better utilize the pipe.")
5661 	    .add_see_also({"rgw_put_obj_max_window_size", "rgw_max_chunk_size"}),
5662 	
5663 	    Option("rgw_put_obj_max_window_size", Option::TYPE_SIZE, Option::LEVEL_ADVANCED)
5664 	    .set_default(64_M)
5665 	    .set_description("The maximum RADOS write window size (in bytes).")
5666 	    .set_long_description("The window size may be dynamically adjusted, but will not surpass this value.")
5667 	    .add_see_also({"rgw_put_obj_min_window_size", "rgw_max_chunk_size"}),
5668 	
5669 	    Option("rgw_max_put_size", Option::TYPE_SIZE, Option::LEVEL_ADVANCED)
5670 	    .set_default(5_G)
5671 	    .set_description("Max size (in bytes) of regular (non multi-part) object upload.")
5672 	    .set_long_description(
5673 	        "Plain object upload is capped at this amount of data. In order to upload larger "
5674 	        "objects, a special upload mechanism is required. The S3 API provides the "
5675 	        "multi-part upload, and Swift provides DLO and SLO."),
5676 	
5677 	    Option("rgw_max_put_param_size", Option::TYPE_SIZE, Option::LEVEL_ADVANCED)
5678 	    .set_default(1_M)
5679 	    .set_description("The maximum size (in bytes) of data input of certain RESTful requests."),
5680 	
5681 	    Option("rgw_max_attr_size", Option::TYPE_SIZE, Option::LEVEL_ADVANCED)
5682 	    .set_default(0)
5683 	    .set_description("The maximum length of metadata value. 0 skips the check"),
5684 	
5685 	    Option("rgw_max_attr_name_len", Option::TYPE_SIZE, Option::LEVEL_ADVANCED)
5686 	    .set_default(0)
5687 	    .set_description("The maximum length of metadata name. 0 skips the check"),
5688 	
5689 	    Option("rgw_max_attrs_num_in_req", Option::TYPE_UINT, Option::LEVEL_ADVANCED)
5690 	    .set_default(0)
5691 	    .set_description("The maximum number of metadata items that can be put via single request"),
5692 	
5693 	    Option("rgw_override_bucket_index_max_shards", Option::TYPE_UINT, Option::LEVEL_DEV)
5694 	    .set_default(0)
5695 	    .set_description(""),
5696 	
5697 	    Option("rgw_bucket_index_max_aio", Option::TYPE_UINT, Option::LEVEL_ADVANCED)
5698 	    .set_default(128)
5699 	    .set_description("Max number of concurrent RADOS requests when handling bucket shards."),
5700 	
5701 	    Option("rgw_enable_quota_threads", Option::TYPE_BOOL, Option::LEVEL_ADVANCED)
5702 	    .set_default(true)
5703 	    .set_description("Enables the quota maintenance thread.")
5704 	    .set_long_description(
5705 	        "The quota maintenance thread is responsible for quota related maintenance work. "
5706 	        "The thread itself can be disabled, but in order for quota to work correctly, at "
5707 	        "least one RGW in each zone needs to have this thread running. Having the thread "
5708 	        "enabled on multiple RGW processes within the same zone can spread "
5709 	        "some of the maintenance work between them.")
5710 	    .add_see_also({"rgw_enable_gc_threads", "rgw_enable_lc_threads"}),
5711 	
5712 	    Option("rgw_enable_gc_threads", Option::TYPE_BOOL, Option::LEVEL_ADVANCED)
5713 	    .set_default(true)
5714 	    .set_description("Enables the garbage collection maintenance thread.")
5715 	    .set_long_description(
5716 	        "The garbage collection maintenance thread is responsible for garbage collector "
5717 	        "maintenance work. The thread itself can be disabled, but in order for garbage "
5718 	        "collection to work correctly, at least one RGW in each zone needs to have this "
5719 	        "thread running.  Having the thread enabled on multiple RGW processes within the "
5720 	        "same zone can spread some of the maintenance work between them.")
5721 	    .add_see_also({"rgw_enable_quota_threads", "rgw_enable_lc_threads"}),
5722 	
5723 	    Option("rgw_enable_lc_threads", Option::TYPE_BOOL, Option::LEVEL_ADVANCED)
5724 	    .set_default(true)
5725 	    .set_description("Enables the lifecycle maintenance thread. This is required on at least one rgw for each zone.")
5726 	    .set_long_description(
5727 	        "The lifecycle maintenance thread is responsible for lifecycle related maintenance "
5728 	        "work. The thread itself can be disabled, but in order for lifecycle to work "
5729 	        "correctly, at least one RGW in each zone needs to have this thread running. Having"
5730 	        "the thread enabled on multiple RGW processes within the same zone can spread "
5731 	        "some of the maintenance work between them.")
5732 	    .add_see_also({"rgw_enable_gc_threads", "rgw_enable_quota_threads"}),
5733 	
5734 	    Option("rgw_data", Option::TYPE_STR, Option::LEVEL_ADVANCED)
5735 	    .set_default("/var/lib/ceph/radosgw/$cluster-$id")
5736 	    .set_flag(Option::FLAG_NO_MON_UPDATE)
5737 	    .set_description("Alternative location for RGW configuration.")
5738 	    .set_long_description(
5739 	        "If this is set, the different Ceph system configurables (such as the keyring file "
5740 	        "will be located in the path that is specified here. "),
5741 	
5742 	    Option("rgw_enable_apis", Option::TYPE_STR, Option::LEVEL_ADVANCED)
5743 	    .set_default("s3, s3website, swift, swift_auth, admin, sts, iam, pubsub")
5744 	    .set_description("A list of set of RESTful APIs that rgw handles."),
5745 	
5746 	    Option("rgw_cache_enabled", Option::TYPE_BOOL, Option::LEVEL_ADVANCED)
5747 	    .set_default(true)
5748 	    .set_description("Enable RGW metadata cache.")
5749 	    .set_long_description(
5750 	        "The metadata cache holds metadata entries that RGW requires for processing "
5751 	        "requests. Metadata entries can be user info, bucket info, and bucket instance "
5752 	        "info. If not found in the cache, entries will be fetched from the backing "
5753 	        "RADOS store.")
5754 	    .add_see_also("rgw_cache_lru_size"),
5755 	
5756 	    Option("rgw_cache_lru_size", Option::TYPE_INT, Option::LEVEL_ADVANCED)
5757 	    .set_default(10000)
5758 	    .set_description("Max number of items in RGW metadata cache.")
5759 	    .set_long_description(
5760 	        "When full, the RGW metadata cache evicts least recently used entries.")
5761 	    .add_see_also("rgw_cache_enabled"),
5762 	
5763 	    Option("rgw_socket_path", Option::TYPE_STR, Option::LEVEL_ADVANCED)
5764 	    .set_default("")
5765 	    .set_description("RGW FastCGI socket path (for FastCGI over Unix domain sockets).")
5766 	    .add_see_also("rgw_fcgi_socket_backlog"),
5767 	
5768 	    Option("rgw_host", Option::TYPE_STR, Option::LEVEL_ADVANCED)
5769 	    .set_default("")
5770 	    .set_description("RGW FastCGI host name (for FastCGI over TCP)")
5771 	    .add_see_also({"rgw_port", "rgw_fcgi_socket_backlog"}),
5772 	
5773 	    Option("rgw_port", Option::TYPE_STR, Option::LEVEL_BASIC)
5774 	    .set_default("")
5775 	    .set_description("RGW FastCGI port number (for FastCGI over TCP)")
5776 	    .add_see_also({"rgw_host", "rgw_fcgi_socket_backlog"}),
5777 	
5778 	    Option("rgw_dns_name", Option::TYPE_STR, Option::LEVEL_ADVANCED)
5779 	    .set_default("")
5780 	    .set_description("The host name that RGW uses.")
5781 	    .set_long_description(
5782 	        "This is Needed for virtual hosting of buckets to work properly, unless configured "
5783 	        "via zonegroup configuration."),
5784 	
5785 	    Option("rgw_dns_s3website_name", Option::TYPE_STR, Option::LEVEL_ADVANCED)
5786 	    .set_default("")
5787 	    .set_description("The host name that RGW uses for static websites (S3)")
5788 	    .set_long_description(
5789 	        "This is needed for virtual hosting of buckets, unless configured via zonegroup "
5790 	        "configuration."),
5791 	
5792 	    Option("rgw_service_provider_name", Option::TYPE_STR, Option::LEVEL_ADVANCED)
5793 	    .set_default("")
5794 	    .set_description("Service provider name which is contained in http response headers")
5795 	    .set_long_description(
5796 	        "As S3 or other cloud storage providers do, http response headers should contain the name of the provider. "
5797 	        "This name will be placed in http header 'Server'."),
5798 	
5799 	    Option("rgw_content_length_compat", Option::TYPE_BOOL, Option::LEVEL_ADVANCED)
5800 	    .set_default(false)
5801 	    .set_description("Multiple content length headers compatibility")
5802 	    .set_long_description(
5803 	        "Try to handle requests with abiguous multiple content length headers "
5804 	        "(Content-Length, Http-Content-Length)."),
5805 	
5806 	    Option("rgw_relaxed_region_enforcement", Option::TYPE_BOOL, Option::LEVEL_ADVANCED)
5807 	    .set_default(false)
5808 	    .set_description("Disable region constraint enforcement")
5809 	    .set_long_description(
5810 	        "Enable requests such as bucket creation to succeed irrespective of region restrictions (Jewel compat)."),
5811 	
5812 	    Option("rgw_lifecycle_work_time", Option::TYPE_STR, Option::LEVEL_ADVANCED)
5813 	    .set_default("00:00-06:00")
5814 	    .set_description("Lifecycle allowed work time")
5815 	    .set_long_description("Local time window in which the lifecycle maintenance thread can work."),
5816 	
5817 	    Option("rgw_lc_lock_max_time", Option::TYPE_INT, Option::LEVEL_DEV)
5818 	    .set_default(60)
5819 	    .set_description(""),
5820 	
5821 	    Option("rgw_lc_thread_delay", Option::TYPE_INT, Option::LEVEL_ADVANCED)
5822 	    .set_default(0)
5823 	    .set_description("Delay after processing of bucket listing chunks (i.e., per 1000 entries) in milliseconds"),
5824 	
5825 	    Option("rgw_lc_max_objs", Option::TYPE_INT, Option::LEVEL_ADVANCED)
5826 	    .set_default(32)
5827 	    .set_description("Number of lifecycle data shards")
5828 	    .set_long_description(
5829 	          "Number of RADOS objects to use for storing lifecycle index. This can affect "
5830 	          "concurrency of lifecycle maintenance, but requires multiple RGW processes "
5831 	          "running on the zone to be utilized."),
5832 	
5833 	    Option("rgw_lc_max_rules", Option::TYPE_UINT, Option::LEVEL_ADVANCED)
5834 	    .set_default(1000)
5835 	    .set_description("Max number of lifecycle rules set on one bucket")
5836 	    .set_long_description("Number of lifecycle rules set on one bucket should be limited."),
5837 	
5838 	    Option("rgw_lc_debug_interval", Option::TYPE_INT, Option::LEVEL_DEV)
5839 	    .set_default(-1)
5840 	    .set_description(""),
5841 	
5842 	    Option("rgw_mp_lock_max_time", Option::TYPE_INT, Option::LEVEL_ADVANCED)
5843 	    .set_default(600)
5844 	    .set_description("Multipart upload max completion time")
5845 	    .set_long_description(
5846 	        "Time length to allow completion of a multipart upload operation. This is done "
5847 	        "to prevent concurrent completions on the same object with the same upload id."),
5848 	
5849 	    Option("rgw_script_uri", Option::TYPE_STR, Option::LEVEL_DEV)
5850 	    .set_default("")
5851 	    .set_description(""),
5852 	
5853 	    Option("rgw_request_uri", Option::TYPE_STR, Option::LEVEL_DEV)
5854 	    .set_default("")
5855 	    .set_description(""),
5856 	
5857 	    Option("rgw_ignore_get_invalid_range", Option::TYPE_BOOL, Option::LEVEL_ADVANCED)
5858 	    .set_default(false)
5859 	    .set_description("Treat invalid (e.g., negative) range request as full")
5860 	    .set_long_description("Treat invalid (e.g., negative) range request "
5861 				  "as request for the full object (AWS compatibility)"),
5862 	
5863 	    Option("rgw_swift_url", Option::TYPE_STR, Option::LEVEL_ADVANCED)
5864 	    .set_default("")
5865 	    .set_description("Swift-auth storage URL")
5866 	    .set_long_description(
5867 	        "Used in conjunction with rgw internal swift authentication. This affects the "
5868 	        "X-Storage-Url response header value.")
5869 	    .add_see_also("rgw_swift_auth_entry"),
5870 	
5871 	    Option("rgw_swift_url_prefix", Option::TYPE_STR, Option::LEVEL_ADVANCED)
5872 	    .set_default("swift")
5873 	    .set_description("Swift URL prefix")
5874 	    .set_long_description("The URL path prefix for swift requests."),
5875 	
5876 	    Option("rgw_swift_auth_url", Option::TYPE_STR, Option::LEVEL_ADVANCED)
5877 	    .set_default("")
5878 	    .set_description("Swift auth URL")
5879 	    .set_long_description(
5880 	        "Default url to which RGW connects and verifies tokens for v1 auth (if not using "
5881 	        "internal swift auth)."),
5882 	
5883 	    Option("rgw_swift_auth_entry", Option::TYPE_STR, Option::LEVEL_ADVANCED)
5884 	    .set_default("auth")
5885 	    .set_description("Swift auth URL prefix")
5886 	    .set_long_description("URL path prefix for internal swift auth requests.")
5887 	    .add_see_also("rgw_swift_url"),
5888 	
5889 	    Option("rgw_swift_tenant_name", Option::TYPE_STR, Option::LEVEL_ADVANCED)
5890 	    .set_default("")
5891 	    .set_description("Swift tenant name")
5892 	    .set_long_description("Tenant name that is used when constructing the swift path.")
5893 	    .add_see_also("rgw_swift_account_in_url"),
5894 	
5895 	    Option("rgw_swift_account_in_url", Option::TYPE_BOOL, Option::LEVEL_ADVANCED)
5896 	    .set_default(false)
5897 	    .set_description("Swift account encoded in URL")
5898 	    .set_long_description("Whether the swift account is encoded in the uri path (AUTH_<account>).")
5899 	    .add_see_also("rgw_swift_tenant_name"),
5900 	
5901 	    Option("rgw_swift_enforce_content_length", Option::TYPE_BOOL, Option::LEVEL_ADVANCED)
5902 	    .set_default(false)
5903 	    .set_description("Send content length when listing containers (Swift)")
5904 	    .set_long_description(
5905 	        "Whether content length header is needed when listing containers. When this is "
5906 	        "set to false, RGW will send extra info for each entry in the response."),
5907 	
5908 	    Option("rgw_keystone_url", Option::TYPE_STR, Option::LEVEL_BASIC)
5909 	    .set_default("")
5910 	    .set_description("The URL to the Keystone server."),
5911 	
5912 	    Option("rgw_keystone_admin_token", Option::TYPE_STR, Option::LEVEL_ADVANCED)
5913 	    .set_default("")
5914 	    .set_description("DEPRECATED: The admin token (shared secret) that is used for the Keystone requests."),
5915 	
5916 	    Option("rgw_keystone_admin_token_path", Option::TYPE_STR, Option::LEVEL_ADVANCED)
5917 	    .set_default("")
5918 	    .set_description("Path to a file containing the admin token (shared secret) that is used for the Keystone requests."),
5919 	
5920 	    Option("rgw_keystone_admin_user", Option::TYPE_STR, Option::LEVEL_ADVANCED)
5921 	    .set_default("")
5922 	    .set_description("Keystone admin user."),
5923 	
5924 	    Option("rgw_keystone_admin_password", Option::TYPE_STR, Option::LEVEL_ADVANCED)
5925 	    .set_default("")
5926 	    .set_description("DEPRECATED: Keystone admin password."),
5927 	
5928 	    Option("rgw_keystone_admin_password_path", Option::TYPE_STR, Option::LEVEL_ADVANCED)
5929 	    .set_default("")
5930 	    .set_description("Path to a file containing the Keystone admin password."),
5931 	
5932 	    Option("rgw_keystone_admin_tenant", Option::TYPE_STR, Option::LEVEL_ADVANCED)
5933 	    .set_default("")
5934 	    .set_description("Keystone admin user tenant."),
5935 	
5936 	    Option("rgw_keystone_admin_project", Option::TYPE_STR, Option::LEVEL_ADVANCED)
5937 	    .set_default("")
5938 	    .set_description("Keystone admin user project (for Keystone v3)."),
5939 	
5940 	    Option("rgw_keystone_admin_domain", Option::TYPE_STR, Option::LEVEL_ADVANCED)
5941 	    .set_default("")
5942 	    .set_description("Keystone admin user domain (for Keystone v3)."),
5943 	
5944 	    Option("rgw_keystone_barbican_user", Option::TYPE_STR, Option::LEVEL_ADVANCED)
5945 	    .set_default("")
5946 	    .set_description("Keystone user to access barbican secrets."),
5947 	
5948 	    Option("rgw_keystone_barbican_password", Option::TYPE_STR, Option::LEVEL_ADVANCED)
5949 	    .set_default("")
5950 	    .set_description("Keystone password for barbican user."),
5951 	
5952 	    Option("rgw_keystone_barbican_tenant", Option::TYPE_STR, Option::LEVEL_ADVANCED)
5953 	    .set_default("")
5954 	    .set_description("Keystone barbican user tenant (Keystone v2.0)."),
5955 	
5956 	    Option("rgw_keystone_barbican_project", Option::TYPE_STR, Option::LEVEL_ADVANCED)
5957 	    .set_default("")
5958 	    .set_description("Keystone barbican user project (Keystone v3)."),
5959 	
5960 	    Option("rgw_keystone_barbican_domain", Option::TYPE_STR, Option::LEVEL_ADVANCED)
5961 	    .set_default("")
5962 	    .set_description("Keystone barbican user domain."),
5963 	
5964 	    Option("rgw_keystone_api_version", Option::TYPE_INT, Option::LEVEL_ADVANCED)
5965 	    .set_default(2)
5966 	    .set_description("Version of Keystone API to use (2 or 3)."),
5967 	
5968 	    Option("rgw_keystone_accepted_roles", Option::TYPE_STR, Option::LEVEL_ADVANCED)
5969 	    .set_default("Member, admin")
5970 	    .set_description("Only users with one of these roles will be served when doing Keystone authentication."),
5971 	
5972 	    Option("rgw_keystone_accepted_admin_roles", Option::TYPE_STR, Option::LEVEL_ADVANCED)
5973 	    .set_default("")
5974 	    .set_description("List of roles allowing user to gain admin privileges (Keystone)."),
5975 	
5976 	    Option("rgw_keystone_token_cache_size", Option::TYPE_INT, Option::LEVEL_ADVANCED)
5977 	    .set_default(10000)
5978 	    .set_description("Keystone token cache size")
5979 	    .set_long_description(
5980 	        "Max number of Keystone tokens that will be cached. Token that is not cached "
5981 	        "requires RGW to access the Keystone server when authenticating."),
5982 	
5983 	    Option("rgw_keystone_verify_ssl", Option::TYPE_BOOL, Option::LEVEL_ADVANCED)
5984 	    .set_default(true)
5985 	    .set_description("Should RGW verify the Keystone server SSL certificate."),
5986 	
5987 	    Option("rgw_keystone_implicit_tenants", Option::TYPE_STR, Option::LEVEL_ADVANCED)
5988 	    .set_default("false")
5989 	    .set_enum_allowed( { "false", "true", "swift", "s3", "both", "0", "1", "none" } )
5990 	    .set_description("RGW Keystone implicit tenants creation")
5991 	    .set_long_description(
5992 	        "Implicitly create new users in their own tenant with the same name when "
5993 	        "authenticating via Keystone.  Can be limited to s3 or swift only."),
5994 	
5995 	    Option("rgw_cross_domain_policy", Option::TYPE_STR, Option::LEVEL_ADVANCED)
5996 	    .set_default("<allow-access-from domain=\"*\" secure=\"false\" />")
5997 	    .set_description("RGW handle cross domain policy")
5998 	    .set_long_description("Returned cross domain policy when accessing the crossdomain.xml "
5999 	                          "resource (Swift compatiility)."),
6000 	
6001 	    Option("rgw_healthcheck_disabling_path", Option::TYPE_STR, Option::LEVEL_DEV)
6002 	    .set_default("")
6003 	    .set_description("Swift health check api can be disabled if a file can be accessed in this path."),
6004 	
6005 	    Option("rgw_s3_auth_use_rados", Option::TYPE_BOOL, Option::LEVEL_ADVANCED)
6006 	    .set_default(true)
6007 	    .set_description("Should S3 authentication use credentials stored in RADOS backend."),
6008 	
6009 	    Option("rgw_s3_auth_use_keystone", Option::TYPE_BOOL, Option::LEVEL_ADVANCED)
6010 	    .set_default(false)
6011 	    .set_description("Should S3 authentication use Keystone."),
6012 	
6013 	    Option("rgw_s3_auth_order", Option::TYPE_STR, Option::LEVEL_ADVANCED)
6014 	     .set_default("sts, external, local")
6015 	     .set_description("Authentication strategy order to use for s3 authentication")
6016 	     .set_long_description(
6017 		  "Order of authentication strategies to try for s3 authentication, the allowed "
6018 		   "options are a comma separated list of engines external, local. The "
6019 		   "default order is to try all the externally configured engines before "
6020 		   "attempting local rados based authentication"),
6021 	
6022 	    Option("rgw_barbican_url", Option::TYPE_STR, Option::LEVEL_ADVANCED)
6023 	    .set_default("")
6024 	    .set_description("URL to barbican server."),
6025 	
6026 	    Option("rgw_ldap_uri", Option::TYPE_STR, Option::LEVEL_ADVANCED)
6027 	    .set_default("ldaps://<ldap.your.domain>")
6028 	    .set_description("Space-separated list of LDAP servers in URI format."),
6029 	
6030 	    Option("rgw_ldap_binddn", Option::TYPE_STR, Option::LEVEL_ADVANCED)
6031 	    .set_default("uid=admin,cn=users,dc=example,dc=com")
6032 	    .set_description("LDAP entry RGW will bind with (user match)."),
6033 	
6034 	    Option("rgw_ldap_searchdn", Option::TYPE_STR, Option::LEVEL_ADVANCED)
6035 	    .set_default("cn=users,cn=accounts,dc=example,dc=com")
6036 	    .set_description("LDAP search base (basedn)."),
6037 	
6038 	    Option("rgw_ldap_dnattr", Option::TYPE_STR, Option::LEVEL_ADVANCED)
6039 	    .set_default("uid")
6040 	    .set_description("LDAP attribute containing RGW user names (to form binddns)."),
6041 	
6042 	    Option("rgw_ldap_secret", Option::TYPE_STR, Option::LEVEL_ADVANCED)
6043 	    .set_default("/etc/openldap/secret")
6044 	    .set_description("Path to file containing credentials for rgw_ldap_binddn."),
6045 	
6046 	    Option("rgw_s3_auth_use_ldap", Option::TYPE_BOOL, Option::LEVEL_ADVANCED)
6047 	    .set_default(false)
6048 	    .set_description("Should S3 authentication use LDAP."),
6049 	
6050 	    Option("rgw_ldap_searchfilter", Option::TYPE_STR, Option::LEVEL_ADVANCED)
6051 	    .set_default("")
6052 	    .set_description("LDAP search filter."),
6053 	
6054 	    Option("rgw_opa_url", Option::TYPE_STR, Option::LEVEL_ADVANCED)
6055 	    .set_default("")
6056 	    .set_description("URL to OPA server."),
6057 	
6058 	    Option("rgw_opa_token", Option::TYPE_STR, Option::LEVEL_ADVANCED)
6059 	    .set_default("")
6060 	    .set_description("The Bearer token OPA uses to authenticate client requests."),
6061 	
6062 	    Option("rgw_opa_verify_ssl", Option::TYPE_BOOL, Option::LEVEL_ADVANCED)
6063 	    .set_default(true)
6064 	    .set_description("Should RGW verify the OPA server SSL certificate."),
6065 	
6066 	    Option("rgw_use_opa_authz", Option::TYPE_BOOL, Option::LEVEL_ADVANCED)
6067 	    .set_default(false)
6068 	    .set_description("Should OPA be used to authorize client requests."),
6069 	
6070 	    Option("rgw_admin_entry", Option::TYPE_STR, Option::LEVEL_ADVANCED)
6071 	    .set_default("admin")
6072 	    .set_description("Path prefix to be used for accessing RGW RESTful admin API."),
6073 	
6074 	    Option("rgw_enforce_swift_acls", Option::TYPE_BOOL, Option::LEVEL_ADVANCED)
6075 	    .set_default(true)
6076 	    .set_description("RGW enforce swift acls")
6077 	    .set_long_description(
6078 	        "Should RGW enforce special Swift-only ACLs. Swift has a special ACL that gives "
6079 	        "permission to access all objects in a container."),
6080 	
6081 	    Option("rgw_swift_token_expiration", Option::TYPE_INT, Option::LEVEL_ADVANCED)
6082 	    .set_default(1_day)
6083 	    .set_description("Expiration time (in seconds) for token generated through RGW Swift auth."),
6084 	
6085 	    Option("rgw_print_continue", Option::TYPE_BOOL, Option::LEVEL_ADVANCED)
6086 	    .set_default(true)
6087 	    .set_description("RGW support of 100-continue")
6088 	    .set_long_description(
6089 	        "Should RGW explicitly send 100 (continue) responses. This is mainly relevant when "
6090 	        "using FastCGI, as some FastCGI modules do not fully support this feature."),
6091 	
6092 	    Option("rgw_print_prohibited_content_length", Option::TYPE_BOOL, Option::LEVEL_ADVANCED)
6093 	    .set_default(false)
6094 	    .set_description("RGW RFC-7230 compatibility")
6095 	    .set_long_description(
6096 	        "Specifies whether RGW violates RFC 7230 and sends Content-Length with 204 or 304 "
6097 	        "statuses."),
6098 	
6099 	    Option("rgw_remote_addr_param", Option::TYPE_STR, Option::LEVEL_ADVANCED)
6100 	    .set_default("REMOTE_ADDR")
6101 	    .set_description("HTTP header that holds the remote address in incoming requests.")
6102 	    .set_long_description(
6103 	        "RGW will use this header to extract requests origin. When RGW runs behind "
6104 	        "a reverse proxy, the remote address header will point at the proxy's address "
6105 	        "and not at the originator's address. Therefore it is sometimes possible to "
6106 	        "have the proxy add the originator's address in a separate HTTP header, which "
6107 	        "will allow RGW to log it correctly."
6108 	        )
6109 	    .add_see_also("rgw_enable_ops_log"),
6110 	
6111 	    Option("rgw_op_thread_timeout", Option::TYPE_INT, Option::LEVEL_DEV)
6112 	    .set_default(10*60)
6113 	    .set_description("Timeout for async rados coroutine operations."),
6114 	
6115 	    Option("rgw_op_thread_suicide_timeout", Option::TYPE_INT, Option::LEVEL_DEV)
6116 	    .set_default(0)
6117 	    .set_description(""),
6118 	
6119 	    Option("rgw_thread_pool_size", Option::TYPE_INT, Option::LEVEL_BASIC)
6120 	    .set_default(512)
6121 	    .set_description("RGW requests handling thread pool size.")
6122 	    .set_long_description(
6123 	        "This parameter determines the number of concurrent requests RGW can process "
6124 	        "when using either the civetweb, or the fastcgi frontends. The higher this "
6125 	        "number is, RGW will be able to deal with more concurrent requests at the "
6126 	        "cost of more resource utilization."),
6127 	
6128 	    Option("rgw_num_control_oids", Option::TYPE_INT, Option::LEVEL_ADVANCED)
6129 	    .set_default(8)
6130 	    .set_description("Number of control objects used for cross-RGW communication.")
6131 	    .set_long_description(
6132 	        "RGW uses certain control objects to send messages between different RGW "
6133 	        "processes running on the same zone. These messages include metadata cache "
6134 	        "invalidation info that is being sent when metadata is modified (such as "
6135 	        "user or bucket information). A higher number of control objects allows "
6136 	        "better concurrency of these messages, at the cost of more resource "
6137 	        "utilization."),
6138 	
6139 	    Option("rgw_num_rados_handles", Option::TYPE_UINT, Option::LEVEL_ADVANCED)
6140 	    .set_default(1)
6141 	    .set_description("Number of librados handles that RGW uses.")
6142 	    .set_long_description(
6143 	        "This param affects the number of separate librados handles it uses to "
6144 	        "connect to the RADOS backend, which directly affects the number of connections "
6145 	        "RGW will have to each OSD. A higher number affects resource utilization."),
6146 	
6147 	    Option("rgw_verify_ssl", Option::TYPE_BOOL, Option::LEVEL_ADVANCED)
6148 	    .set_default(true)
6149 	    .set_description("Should RGW verify SSL when connecing to a remote HTTP server")
6150 	    .set_long_description(
6151 	        "RGW can send requests to other RGW servers (e.g., in multi-site sync work). "
6152 	        "This configurable selects whether RGW should verify the certificate for "
6153 	        "the remote peer and host.")
6154 	    .add_see_also("rgw_keystone_verify_ssl"),
6155 	
6156 	    Option("rgw_nfs_lru_lanes", Option::TYPE_INT, Option::LEVEL_ADVANCED)
6157 	    .set_default(5)
6158 	    .set_description(""),
6159 	
6160 	    Option("rgw_nfs_lru_lane_hiwat", Option::TYPE_INT, Option::LEVEL_ADVANCED)
6161 	    .set_default(911)
6162 	    .set_description(""),
6163 	
6164 	    Option("rgw_nfs_fhcache_partitions", Option::TYPE_INT, Option::LEVEL_ADVANCED)
6165 	    .set_default(3)
6166 	    .set_description(""),
6167 	
6168 	    Option("rgw_nfs_fhcache_size", Option::TYPE_INT, Option::LEVEL_ADVANCED)
6169 	    .set_default(2017)
6170 	    .set_description(""),
6171 	
6172 	    Option("rgw_nfs_namespace_expire_secs", Option::TYPE_INT, Option::LEVEL_ADVANCED)
6173 	    .set_default(300)
6174 	    .set_min(1)
6175 	    .set_description(""),
6176 	
6177 	    Option("rgw_nfs_max_gc", Option::TYPE_INT, Option::LEVEL_ADVANCED)
6178 	    .set_default(300)
6179 	    .set_min(1)
6180 	    .set_description(""),
6181 	
6182 	    Option("rgw_nfs_write_completion_interval_s", Option::TYPE_INT, Option::LEVEL_ADVANCED)
6183 	    .set_default(10)
6184 	    .set_description(""),
6185 	
6186 	    Option("rgw_nfs_s3_fast_attrs", Option::TYPE_BOOL, Option::LEVEL_ADVANCED)
6187 	    .set_default(false)
6188 	    .set_description("use fast S3 attrs from bucket index (immutable only)")
6189 	    .set_long_description("use fast S3 attrs from bucket index (assumes NFS "
6190 				  "mounts are immutable)"),
6191 	
6192 	    Option("rgw_rados_pool_autoscale_bias", Option::TYPE_FLOAT, Option::LEVEL_ADVANCED)
6193 	    .set_default(4.0)
6194 	    .set_min_max(0.01, 100000.0)
6195 	    .set_description("pg_autoscale_bias value for RGW metadata (omap-heavy) pools"),
6196 	
6197 	    Option("rgw_rados_pool_pg_num_min", Option::TYPE_UINT, Option::LEVEL_ADVANCED)
6198 	    .set_default(8)
6199 	    .set_min_max(1, 1024)
6200 	    .set_description("pg_num_min value for RGW metadata (omap-heavy) pools"),
6201 	
6202 	    Option("rgw_rados_pool_recovery_priority", Option::TYPE_UINT, Option::LEVEL_ADVANCED)
6203 	    .set_default(5)
6204 	    .set_min_max(-10, 10)
6205 	    .set_description("recovery_priority value for RGW metadata (omap-heavy) pools"),
6206 	
6207 	    Option("rgw_zone", Option::TYPE_STR, Option::LEVEL_ADVANCED)
6208 	    .set_default("")
6209 	    .set_description("Zone name")
6210 	    .add_see_also({"rgw_zonegroup", "rgw_realm"}),
6211 	
6212 	    Option("rgw_zone_root_pool", Option::TYPE_STR, Option::LEVEL_ADVANCED)
6213 	    .set_default(".rgw.root")
6214 	    .set_description("Zone root pool name")
6215 	    .set_long_description(
6216 	        "The zone root pool, is the pool where the RGW zone configuration located."
6217 	    )
6218 	    .add_see_also({"rgw_zonegroup_root_pool", "rgw_realm_root_pool", "rgw_period_root_pool"}),
6219 	
6220 	    Option("rgw_default_zone_info_oid", Option::TYPE_STR, Option::LEVEL_ADVANCED)
6221 	    .set_default("default.zone")
6222 	    .set_description("Default zone info object id")
6223 	    .set_long_description(
6224 	        "Name of the RADOS object that holds the default zone information."
6225 	    ),
6226 	
6227 	    Option("rgw_region", Option::TYPE_STR, Option::LEVEL_ADVANCED)
6228 	    .set_default("")
6229 	    .set_description("Region name")
6230 	    .set_long_description(
6231 	        "Obsolete config option. The rgw_zonegroup option should be used instead.")
6232 	    .add_see_also("rgw_zonegroup"),
6233 	
6234 	    Option("rgw_region_root_pool", Option::TYPE_STR, Option::LEVEL_ADVANCED)
6235 	    .set_default(".rgw.root")
6236 	    .set_description("Region root pool")
6237 	    .set_long_description(
6238 	        "Obsolete config option. The rgw_zonegroup_root_pool should be used instead.")
6239 	    .add_see_also("rgw_zonegroup_root_pool"),
6240 	
6241 	    Option("rgw_default_region_info_oid", Option::TYPE_STR, Option::LEVEL_ADVANCED)
6242 	    .set_default("default.region")
6243 	    .set_description("Default region info object id")
6244 	    .set_long_description(
6245 	        "Obsolete config option. The rgw_default_zonegroup_info_oid should be used instead.")
6246 	    .add_see_also("rgw_default_zonegroup_info_oid"),
6247 	
6248 	    Option("rgw_zonegroup", Option::TYPE_STR, Option::LEVEL_ADVANCED)
6249 	    .set_default("")
6250 	    .set_description("Zonegroup name")
6251 	    .add_see_also({"rgw_zone", "rgw_realm"}),
6252 	
6253 	    Option("rgw_zonegroup_root_pool", Option::TYPE_STR, Option::LEVEL_ADVANCED)
6254 	    .set_default(".rgw.root")
6255 	    .set_description("Zonegroup root pool")
6256 	    .set_long_description(
6257 	        "The zonegroup root pool, is the pool where the RGW zonegroup configuration located."
6258 	    )
6259 	    .add_see_also({"rgw_zone_root_pool", "rgw_realm_root_pool", "rgw_period_root_pool"}),
6260 	
6261 	    Option("rgw_default_zonegroup_info_oid", Option::TYPE_STR, Option::LEVEL_ADVANCED)
6262 	    .set_default("default.zonegroup")
6263 	    .set_description(""),
6264 	
6265 	    Option("rgw_realm", Option::TYPE_STR, Option::LEVEL_ADVANCED)
6266 	    .set_default("")
6267 	    .set_description(""),
6268 	
6269 	    Option("rgw_realm_root_pool", Option::TYPE_STR, Option::LEVEL_ADVANCED)
6270 	    .set_default(".rgw.root")
6271 	    .set_description("Realm root pool")
6272 	    .set_long_description(
6273 	        "The realm root pool, is the pool where the RGW realm configuration located."
6274 	    )
6275 	    .add_see_also({"rgw_zonegroup_root_pool", "rgw_zone_root_pool", "rgw_period_root_pool"}),
6276 	
6277 	    Option("rgw_default_realm_info_oid", Option::TYPE_STR, Option::LEVEL_ADVANCED)
6278 	    .set_default("default.realm")
6279 	    .set_description(""),
6280 	
6281 	    Option("rgw_period_root_pool", Option::TYPE_STR, Option::LEVEL_ADVANCED)
6282 	    .set_default(".rgw.root")
6283 	    .set_description("Period root pool")
6284 	    .set_long_description(
6285 	        "The period root pool, is the pool where the RGW period configuration located."
6286 	    )
6287 	    .add_see_also({"rgw_zonegroup_root_pool", "rgw_zone_root_pool", "rgw_realm_root_pool"}),
6288 	
6289 	    Option("rgw_period_latest_epoch_info_oid", Option::TYPE_STR, Option::LEVEL_DEV)
6290 	    .set_default(".latest_epoch")
6291 	    .set_description(""),
6292 	
6293 	    Option("rgw_log_nonexistent_bucket", Option::TYPE_BOOL, Option::LEVEL_ADVANCED)
6294 	    .set_default(false)
6295 	    .set_description("Should RGW log operations on bucket that does not exist")
6296 	    .set_long_description(
6297 	        "This config option applies to the ops log. When this option is set, the ops log "
6298 	        "will log operations that are sent to non existing buckets. These operations "
6299 	        "inherently fail, and do not correspond to a specific user.")
6300 	    .add_see_also("rgw_enable_ops_log"),
6301 	
6302 	    Option("rgw_log_object_name", Option::TYPE_STR, Option::LEVEL_ADVANCED)
6303 	    .set_default("%Y-%m-%d-%H-%i-%n")
6304 	    .set_description("Ops log object name format")
6305 	    .set_long_description(
6306 	        "Defines the format of the RADOS objects names that ops log uses to store ops "
6307 	        "log data")
6308 	    .add_see_also("rgw_enable_ops_log"),
6309 	
6310 	    Option("rgw_log_object_name_utc", Option::TYPE_BOOL, Option::LEVEL_ADVANCED)
6311 	    .set_default(false)
6312 	    .set_description("Should ops log object name based on UTC")
6313 	    .set_long_description(
6314 	        "If set, the names of the RADOS objects that hold the ops log data will be based "
6315 	        "on UTC time zone. If not set, it will use the local time zone.")
6316 	    .add_see_also({"rgw_enable_ops_log", "rgw_log_object_name"}),
6317 	
6318 	    Option("rgw_usage_max_shards", Option::TYPE_INT, Option::LEVEL_ADVANCED)
6319 	    .set_default(32)
6320 	    .set_description("Number of shards for usage log.")
6321 	    .set_long_description(
6322 	        "The number of RADOS objects that RGW will use in order to store the usage log "
6323 	        "data.")
6324 	    .add_see_also("rgw_enable_usage_log"),
6325 	
6326 	    Option("rgw_usage_max_user_shards", Option::TYPE_INT, Option::LEVEL_ADVANCED)
6327 	    .set_default(1)
6328 	    .set_min(1)
6329 	    .set_description("Number of shards for single user in usage log")
6330 	    .set_long_description(
6331 	        "The number of shards that a single user will span over in the usage log.")
6332 	    .add_see_also("rgw_enable_usage_log"),
6333 	
6334 	    Option("rgw_enable_ops_log", Option::TYPE_BOOL, Option::LEVEL_ADVANCED)
6335 	    .set_default(false)
6336 	    .set_description("Enable ops log")
6337 	    .add_see_also({"rgw_log_nonexistent_bucket", "rgw_log_object_name", "rgw_ops_log_rados",
6338 	               "rgw_ops_log_socket_path"}),
6339 	
6340 	    Option("rgw_enable_usage_log", Option::TYPE_BOOL, Option::LEVEL_ADVANCED)
6341 	    .set_default(false)
6342 	    .set_description("Enable usage log")
6343 	    .add_see_also("rgw_usage_max_shards"),
6344 	
6345 	    Option("rgw_ops_log_rados", Option::TYPE_BOOL, Option::LEVEL_ADVANCED)
6346 	    .set_default(true)
6347 	    .set_description("Use RADOS for ops log")
6348 	    .set_long_description(
6349 	       "If set, RGW will store ops log information in RADOS.")
6350 	    .add_see_also({"rgw_enable_ops_log"}),
6351 	
6352 	    Option("rgw_ops_log_socket_path", Option::TYPE_STR, Option::LEVEL_ADVANCED)
6353 	    .set_default("")
6354 	    .set_description("Unix domain socket path for ops log.")
6355 	    .set_long_description(
6356 	        "Path to unix domain socket that RGW will listen for connection on. When connected, "
6357 	        "RGW will send ops log data through it.")
6358 	    .add_see_also({"rgw_enable_ops_log", "rgw_ops_log_data_backlog"}),
6359 	
6360 	    Option("rgw_ops_log_data_backlog", Option::TYPE_SIZE, Option::LEVEL_ADVANCED)
6361 	    .set_default(5 << 20)
6362 	    .set_description("Ops log socket backlog")
6363 	    .set_long_description(
6364 	        "Maximum amount of data backlog that RGW can keep when ops log is configured to "
6365 	        "send info through unix domain socket. When data backlog is higher than this, "
6366 	        "ops log entries will be lost. In order to avoid ops log information loss, the "
6367 	        "listener needs to clear data (by reading it) quickly enough.")
6368 	    .add_see_also({"rgw_enable_ops_log", "rgw_ops_log_socket_path"}),
6369 	
6370 	    Option("rgw_fcgi_socket_backlog", Option::TYPE_INT, Option::LEVEL_ADVANCED)
6371 	    .set_default(1024)
6372 	    .set_description("FastCGI socket connection backlog")
6373 	    .set_long_description(
6374 	        "Size of FastCGI connection backlog. This reflects the maximum number of new "
6375 	        "connection requests that RGW can handle concurrently without dropping any. ")
6376 	    .add_see_also({"rgw_host", "rgw_socket_path"}),
6377 	
6378 	    Option("rgw_usage_log_flush_threshold", Option::TYPE_INT, Option::LEVEL_ADVANCED)
6379 	    .set_default(1024)
6380 	    .set_description("Number of entries in usage log before flushing")
6381 	    .set_long_description(
6382 	        "This is the max number of entries that will be held in the usage log, before it "
6383 	        "will be flushed to the backend. Note that the usage log is periodically flushed, "
6384 	        "even if number of entries does not reach this threshold. A usage log entry "
6385 	        "corresponds to one or more operations on a single bucket.i")
6386 	    .add_see_also({"rgw_enable_usage_log", "rgw_usage_log_tick_interval"}),
6387 	
6388 	    Option("rgw_usage_log_tick_interval", Option::TYPE_INT, Option::LEVEL_ADVANCED)
6389 	    .set_default(30)
6390 	    .set_description("Number of seconds between usage log flush cycles")
6391 	    .set_long_description(
6392 	        "The number of seconds between consecutive usage log flushes. The usage log will "
6393 	        "also flush itself to the backend if the number of pending entries reaches a "
6394 	        "certain threshold.")
6395 	    .add_see_also({"rgw_enable_usage_log", "rgw_usage_log_flush_threshold"}),
6396 	
6397 	    Option("rgw_init_timeout", Option::TYPE_INT, Option::LEVEL_BASIC)
6398 	    .set_default(300)
6399 	    .set_description("Initialization timeout")
6400 	    .set_long_description(
6401 	        "The time length (in seconds) that RGW will allow for its initialization. RGW "
6402 	        "process will give up and quit if initialization is not complete after this amount "
6403 	        "of time."),
6404 	
6405 	    Option("rgw_mime_types_file", Option::TYPE_STR, Option::LEVEL_BASIC)
6406 	    .set_default("/etc/mime.types")
6407 	    .set_description("Path to local mime types file")
6408 	    .set_long_description(
6409 	        "The mime types file is needed in Swift when uploading an object. If object's "
6410 	        "content type is not specified, RGW will use data from this file to assign "
6411 	        "a content type to the object."),
6412 	
6413 	    Option("rgw_gc_max_objs", Option::TYPE_INT, Option::LEVEL_ADVANCED)
6414 	    .set_default(32)
6415 	    .set_description("Number of shards for garbage collector data")
6416 	    .set_long_description(
6417 	        "The number of garbage collector data shards, is the number of RADOS objects that "
6418 	        "RGW will use to store the garbage collection information on.")
6419 	    .add_see_also({"rgw_gc_obj_min_wait", "rgw_gc_processor_max_time", "rgw_gc_processor_period", "rgw_gc_max_concurrent_io"}),
6420 	
6421 	    Option("rgw_gc_obj_min_wait", Option::TYPE_INT, Option::LEVEL_ADVANCED)
6422 	    .set_default(2_hr)
6423 	    .set_description("Garbage collection object expiration time")
6424 	    .set_long_description(
6425 	       "The length of time (in seconds) that the RGW collector will wait before purging "
6426 	       "a deleted object's data. RGW will not remove object immediately, as object could "
6427 	       "still have readers. A mechanism exists to increase the object's expiration time "
6428 	       "when it's being read.")
6429 	    .add_see_also({"rgw_gc_max_objs", "rgw_gc_processor_max_time", "rgw_gc_processor_period", "rgw_gc_max_concurrent_io"}),
6430 	
6431 	    Option("rgw_gc_processor_max_time", Option::TYPE_INT, Option::LEVEL_ADVANCED)
6432 	    .set_default(1_hr)
6433 	    .set_description("Length of time GC processor can lease shard")
6434 	    .set_long_description(
6435 	        "Garbage collection thread in RGW process holds a lease on its data shards. These "
6436 	        "objects contain the information about the objects that need to be removed. RGW "
6437 	        "takes a lease in order to prevent multiple RGW processes from handling the same "
6438 	        "objects concurrently. This time signifies that maximum amount of time (in seconds) that RGW "
6439 	        "is allowed to hold that lease. In the case where RGW goes down uncleanly, this "
6440 	        "is the amount of time where processing of that data shard will be blocked.")
6441 	    .add_see_also({"rgw_gc_max_objs", "rgw_gc_obj_min_wait", "rgw_gc_processor_period", "rgw_gc_max_concurrent_io"}),
6442 	
6443 	    Option("rgw_gc_processor_period", Option::TYPE_INT, Option::LEVEL_ADVANCED)
6444 	    .set_default(1_hr)
6445 	    .set_description("Garbage collector cycle run time")
6446 	    .set_long_description(
6447 	        "The amount of time between the start of consecutive runs of the garbage collector "
6448 	        "threads. If garbage collector runs takes more than this period, it will not wait "
6449 	        "before running again.")
6450 	    .add_see_also({"rgw_gc_max_objs", "rgw_gc_obj_min_wait", "rgw_gc_processor_max_time", "rgw_gc_max_concurrent_io", "rgw_gc_max_trim_chunk"}),
6451 	
6452 	    Option("rgw_gc_max_concurrent_io", Option::TYPE_INT, Option::LEVEL_ADVANCED)
6453 	    .set_default(10)
6454 	    .set_description("Max concurrent RADOS IO operations for garbage collection")
6455 	    .set_long_description(
6456 	        "The maximum number of concurrent IO operations that the RGW garbage collection "
6457 	        "thread will use when purging old data.")
6458 	    .add_see_also({"rgw_gc_max_objs", "rgw_gc_obj_min_wait", "rgw_gc_processor_max_time", "rgw_gc_max_trim_chunk"}),
6459 	
6460 	    Option("rgw_gc_max_trim_chunk", Option::TYPE_INT, Option::LEVEL_ADVANCED)
6461 	    .set_default(16)
6462 	    .set_description("Max number of keys to remove from garbage collector log in a single operation")
6463 	    .add_see_also({"rgw_gc_max_objs", "rgw_gc_obj_min_wait", "rgw_gc_processor_max_time", "rgw_gc_max_concurrent_io"}),
6464 	
6465 	    Option("rgw_s3_success_create_obj_status", Option::TYPE_INT, Option::LEVEL_ADVANCED)
6466 	    .set_default(0)
6467 	    .set_description("HTTP return code override for object creation")
6468 	    .set_long_description(
6469 	        "If not zero, this is the HTTP return code that will be returned on a successful S3 "
6470 	        "object creation."),
6471 	
6472 	    Option("rgw_resolve_cname", Option::TYPE_BOOL, Option::LEVEL_ADVANCED)
6473 	    .set_default(false)
6474 	    .set_description("Support vanity domain names via CNAME")
6475 	    .set_long_description(
6476 	        "If true, RGW will query DNS when detecting that it's serving a request that was "
6477 	        "sent to a host in another domain. If a CNAME record is configured for that domain "
6478 	        "it will use it instead. This gives user to have the ability of creating a unique "
6479 	        "domain of their own to point at data in their bucket."),
6480 	
6481 	    Option("rgw_obj_stripe_size", Option::TYPE_SIZE, Option::LEVEL_ADVANCED)
6482 	    .set_default(4_M)
6483 	    .set_description("RGW object stripe size")
6484 	    .set_long_description(
6485 	        "The size of an object stripe for RGW objects. This is the maximum size a backing "
6486 	        "RADOS object will have. RGW objects that are larger than this will span over "
6487 	        "multiple objects."),
6488 	
6489 	    Option("rgw_extended_http_attrs", Option::TYPE_STR, Option::LEVEL_ADVANCED)
6490 	    .set_default("")
6491 	    .set_description("RGW support extended HTTP attrs")
6492 	    .set_long_description(
6493 	        "Add new set of attributes that could be set on an object. These extra attributes "
6494 	        "can be set through HTTP header fields when putting the objects. If set, these "
6495 	        "attributes will return as HTTP fields when doing GET/HEAD on the object."),
6496 	
6497 	    Option("rgw_exit_timeout_secs", Option::TYPE_INT, Option::LEVEL_ADVANCED)
6498 	    .set_default(120)
6499 	    .set_description("RGW shutdown timeout")
6500 	    .set_long_description("Number of seconds to wait for a process before exiting unconditionally."),
6501 	
6502 	    Option("rgw_get_obj_window_size", Option::TYPE_SIZE, Option::LEVEL_ADVANCED)
6503 	    .set_default(16_M)
6504 	    .set_description("RGW object read window size")
6505 	    .set_long_description("The window size in bytes for a single object read request"),
6506 	
6507 	    Option("rgw_get_obj_max_req_size", Option::TYPE_SIZE, Option::LEVEL_ADVANCED)
6508 	    .set_default(4_M)
6509 	    .set_description("RGW object read chunk size")
6510 	    .set_long_description(
6511 	        "The maximum request size of a single object read operation sent to RADOS"),
6512 	
6513 	    Option("rgw_relaxed_s3_bucket_names", Option::TYPE_BOOL, Option::LEVEL_ADVANCED)
6514 	    .set_default(false)
6515 	    .set_description("RGW enable relaxed S3 bucket names")
6516 	    .set_long_description("RGW enable relaxed S3 bucket name rules for US region buckets."),
6517 	
6518 	    Option("rgw_defer_to_bucket_acls", Option::TYPE_STR, Option::LEVEL_ADVANCED)
6519 	    .set_default("")
6520 	    .set_description("Bucket ACLs override object ACLs")
6521 	    .set_long_description(
6522 	        "If not empty, a string that selects that mode of operation. 'recurse' will use "
6523 	        "bucket's ACL for the authorizaton. 'full-control' will allow users that users "
6524 	        "that have full control permission on the bucket have access to the object."),
6525 	
6526 	    Option("rgw_list_buckets_max_chunk", Option::TYPE_INT, Option::LEVEL_ADVANCED)
6527 	    .set_default(1000)
6528 	    .set_description("Max number of buckets to retrieve in a single listing operation")
6529 	    .set_long_description(
6530 	        "When RGW fetches lists of user's buckets from the backend, this is the max number "
6531 	        "of entries it will try to retrieve in a single operation. Note that the backend "
6532 	        "may choose to return a smaller number of entries."),
6533 	
6534 	    Option("rgw_md_log_max_shards", Option::TYPE_INT, Option::LEVEL_ADVANCED)
6535 	    .set_default(64)
6536 	    .set_description("RGW number of metadata log shards")
6537 	    .set_long_description(
6538 	        "The number of shards the RGW metadata log entries will reside in. This affects "
6539 	        "the metadata sync parallelism as a shard can only be processed by a single "
6540 	        "RGW at a time"),
6541 	
6542 	    Option("rgw_curl_wait_timeout_ms", Option::TYPE_INT, Option::LEVEL_DEV)
6543 	    .set_default(1000)
6544 	    .set_description(""),
6545 	
6546 	    Option("rgw_curl_low_speed_limit", Option::TYPE_INT, Option::LEVEL_ADVANCED)
6547 	    .set_default(1024)
6548 	    .set_long_description(
6549 	        "It contains the average transfer speed in bytes per second that the "
6550 	        "transfer should be below during rgw_curl_low_speed_time seconds for libcurl "
6551 	        "to consider it to be too slow and abort. Set it zero to disable this."),
6552 	
6553 	    Option("rgw_curl_low_speed_time", Option::TYPE_INT, Option::LEVEL_ADVANCED)
6554 	    .set_default(300)
6555 	    .set_long_description(
6556 	        "It contains the time in number seconds that the transfer speed should be below "
6557 	        "the rgw_curl_low_speed_limit for the library to consider it too slow and abort. "
6558 	        "Set it zero to disable this."),
6559 	
6560 	    Option("rgw_copy_obj_progress", Option::TYPE_BOOL, Option::LEVEL_ADVANCED)
6561 	    .set_default(true)
6562 	    .set_description("Send progress report through copy operation")
6563 	    .set_long_description(
6564 	        "If true, RGW will send progress information when copy operation is executed. "),
6565 	
6566 	    Option("rgw_copy_obj_progress_every_bytes", Option::TYPE_SIZE, Option::LEVEL_ADVANCED)
6567 	    .set_default(1_M)
6568 	    .set_description("Send copy-object progress info after these many bytes"),
6569 	
6570 	    Option("rgw_obj_tombstone_cache_size", Option::TYPE_INT, Option::LEVEL_ADVANCED)
6571 	    .set_default(1000)
6572 	    .set_description("Max number of entries to keep in tombstone cache")
6573 	    .set_long_description(
6574 	        "The tombstone cache is used when doing a multi-zone data sync. RGW keeps "
6575 	        "there information about removed objects which is needed in order to prevent "
6576 	        "re-syncing of objects that were already removed."),
6577 	
6578 	    Option("rgw_data_log_window", Option::TYPE_INT, Option::LEVEL_ADVANCED)
6579 	    .set_default(30)
6580 	    .set_description("Data log time window")
6581 	    .set_long_description(
6582 	        "The data log keeps information about buckets that have objectst that were "
6583 	        "modified within a specific timeframe. The sync process then knows which buckets "
6584 	        "are needed to be scanned for data sync."),
6585 	
6586 	    Option("rgw_data_log_changes_size", Option::TYPE_INT, Option::LEVEL_DEV)
6587 	    .set_default(1000)
6588 	    .set_description("Max size of pending changes in data log")
6589 	    .set_long_description(
6590 	        "RGW will trigger update to the data log if the number of pending entries reached "
6591 	        "this number."),
6592 	
6593 	    Option("rgw_data_log_num_shards", Option::TYPE_INT, Option::LEVEL_ADVANCED)
6594 	    .set_default(128)
6595 	    .set_description("Number of data log shards")
6596 	    .set_long_description(
6597 	        "The number of shards the RGW data log entries will reside in. This affects the "
6598 	        "data sync parallelism as a shard can only be processed by a single RGW at a time."),
6599 	
6600 	    Option("rgw_data_log_obj_prefix", Option::TYPE_STR, Option::LEVEL_DEV)
6601 	    .set_default("data_log")
6602 	    .set_description(""),
6603 	
6604 	    Option("rgw_bucket_quota_ttl", Option::TYPE_INT, Option::LEVEL_ADVANCED)
6605 	    .set_default(600)
6606 	    .set_description("Bucket quota stats cache TTL")
6607 	    .set_long_description(
6608 	        "Length of time for bucket stats to be cached within RGW instance."),
6609 	
6610 	    Option("rgw_bucket_quota_soft_threshold", Option::TYPE_FLOAT, Option::LEVEL_BASIC)
6611 	    .set_default(0.95)
6612 	    .set_description("RGW quota soft threshold")
6613 	    .set_long_description(
6614 	        "Threshold from which RGW doesn't rely on cached info for quota "
6615 	        "decisions. This is done for higher accuracy of the quota mechanism at "
6616 	        "cost of performance, when getting close to the quota limit. The value "
6617 	        "configured here is the ratio between the data usage to the max usage "
6618 	        "as specified by the quota."),
6619 	
6620 	    Option("rgw_bucket_quota_cache_size", Option::TYPE_INT, Option::LEVEL_ADVANCED)
6621 	    .set_default(10000)
6622 	    .set_description("RGW quota stats cache size")
6623 	    .set_long_description(
6624 	        "Maximum number of entries in the quota stats cache."),
6625 	
6626 	    Option("rgw_bucket_default_quota_max_objects", Option::TYPE_INT, Option::LEVEL_BASIC)
6627 	    .set_default(-1)
6628 	    .set_description("Default quota for max objects in a bucket")
6629 	    .set_long_description(
6630 	        "The default quota configuration for max number of objects in a bucket. A "
6631 	        "negative number means 'unlimited'."),
6632 	
6633 	    Option("rgw_bucket_default_quota_max_size", Option::TYPE_INT, Option::LEVEL_ADVANCED)
6634 	    .set_default(-1)
6635 	    .set_description("Default quota for total size in a bucket")
6636 	    .set_long_description(
6637 	        "The default quota configuration for total size of objects in a bucket. A "
6638 	        "negative number means 'unlimited'."),
6639 	
6640 	    Option("rgw_expose_bucket", Option::TYPE_BOOL, Option::LEVEL_ADVANCED)
6641 	    .set_default(false)
6642 	    .set_description("Send Bucket HTTP header with the response")
6643 	    .set_long_description(
6644 	        "If true, RGW will send a Bucket HTTP header with the responses. The header will "
6645 	        "contain the name of the bucket the operation happened on."),
6646 	
6647 	    Option("rgw_frontends", Option::TYPE_STR, Option::LEVEL_BASIC)
6648 	    .set_default("beast port=7480")
6649 	    .set_description("RGW frontends configuration")
6650 	    .set_long_description(
6651 	        "A comma delimited list of frontends configuration. Each configuration contains "
6652 	        "the type of the frontend followed by an optional space delimited set of "
6653 	        "key=value config parameters."),
6654 	
6655 	    Option("rgw_user_quota_bucket_sync_interval", Option::TYPE_INT, Option::LEVEL_ADVANCED)
6656 	    .set_default(180)
6657 	    .set_description("User quota bucket sync interval")
6658 	    .set_long_description(
6659 	        "Time period for accumulating modified buckets before syncing these stats."),
6660 	
6661 	    Option("rgw_user_quota_sync_interval", Option::TYPE_INT, Option::LEVEL_ADVANCED)
6662 	    .set_default(1_day)
6663 	    .set_description("User quota sync interval")
6664 	    .set_long_description(
6665 	        "Time period for accumulating modified buckets before syncing entire user stats."),
6666 	
6667 	    Option("rgw_user_quota_sync_idle_users", Option::TYPE_BOOL, Option::LEVEL_ADVANCED)
6668 	    .set_default(false)
6669 	    .set_description("Should sync idle users quota")
6670 	    .set_long_description(
6671 	        "Whether stats for idle users be fully synced."),
6672 	
6673 	    Option("rgw_user_quota_sync_wait_time", Option::TYPE_INT, Option::LEVEL_ADVANCED)
6674 	    .set_default(1_day)
6675 	    .set_description("User quota full-sync wait time")
6676 	    .set_long_description(
6677 	        "Minimum time between two full stats sync for non-idle users."),
6678 	
6679 	    Option("rgw_user_default_quota_max_objects", Option::TYPE_INT, Option::LEVEL_BASIC)
6680 	    .set_default(-1)
6681 	    .set_description("User quota max objects")
6682 	    .set_long_description(
6683 	        "The default quota configuration for total number of objects for a single user. A "
6684 	        "negative number means 'unlimited'."),
6685 	
6686 	    Option("rgw_user_default_quota_max_size", Option::TYPE_INT, Option::LEVEL_BASIC)
6687 	    .set_default(-1)
6688 	    .set_description("User quota max size")
6689 	    .set_long_description(
6690 	        "The default quota configuration for total size of objects for a single user. A "
6691 	        "negative number means 'unlimited'."),
6692 	
6693 	    Option("rgw_multipart_min_part_size", Option::TYPE_SIZE, Option::LEVEL_ADVANCED)
6694 	    .set_default(5_M)
6695 	    .set_description("Minimum S3 multipart-upload part size")
6696 	    .set_long_description(
6697 	        "When doing a multipart upload, each part (other than the last part) should be "
6698 	        "at least this size."),
6699 	
6700 	    Option("rgw_multipart_part_upload_limit", Option::TYPE_INT, Option::LEVEL_ADVANCED)
6701 	    .set_default(10000)
6702 	    .set_description("Max number of parts in multipart upload"),
6703 	
6704 	    Option("rgw_max_slo_entries", Option::TYPE_INT, Option::LEVEL_ADVANCED)
6705 	    .set_default(1000)
6706 	    .set_description("Max number of entries in Swift Static Large Object manifest"),
6707 	
6708 	    Option("rgw_olh_pending_timeout_sec", Option::TYPE_INT, Option::LEVEL_DEV)
6709 	    .set_default(1_hr)
6710 	    .set_description("Max time for pending OLH change to complete")
6711 	    .set_long_description(
6712 	        "OLH is a versioned object's logical head. Operations on it are journaled and "
6713 	        "as pending before completion. If an operation doesn't complete with this amount "
6714 	        "of seconds, we remove the operation from the journal."),
6715 	
6716 	    Option("rgw_user_max_buckets", Option::TYPE_INT, Option::LEVEL_BASIC)
6717 	    .set_default(1000)
6718 	    .set_description("Max number of buckets per user")
6719 	    .set_long_description(
6720 	        "A user can create this many buckets. Zero means unlimmited, negative number means "
6721 	        "user cannot create any buckets (although user will retain buckets already created."),
6722 	
6723 	    Option("rgw_objexp_gc_interval", Option::TYPE_UINT, Option::LEVEL_ADVANCED)
6724 	    .set_default(10_min)
6725 	    .set_description("Swift objects expirer garbage collector interval"),
6726 	
6727 	    Option("rgw_objexp_hints_num_shards", Option::TYPE_UINT, Option::LEVEL_ADVANCED)
6728 	    .set_default(127)
6729 	    .set_description("Number of object expirer data shards")
6730 	    .set_long_description(
6731 	        "The number of shards the (Swift) object expirer will store its data on."),
6732 	
6733 	    Option("rgw_objexp_chunk_size", Option::TYPE_UINT, Option::LEVEL_DEV)
6734 	    .set_default(100)
6735 	    .set_description(""),
6736 	
6737 	    Option("rgw_enable_static_website", Option::TYPE_BOOL, Option::LEVEL_BASIC)
6738 	    .set_default(false)
6739 	    .set_description("Enable static website APIs")
6740 	    .set_long_description(
6741 	        "This configurable controls whether RGW handles the website control APIs. RGW can "
6742 	        "server static websites if s3website hostnames are configured, and unrelated to "
6743 	        "this configurable."),
6744 	
6745 	     Option("rgw_user_unique_email", Option::TYPE_BOOL, Option::LEVEL_BASIC)
6746 	    .set_default(true)
6747 	    .set_description("Require local RGW users to have unique email addresses")
6748 	    .set_long_description(
6749 	        "Enforce builtin user accounts to have unique email addresses.  This "
6750 		"setting is historical.  In future, non-enforcement of email address "
6751 	        "uniqueness is likely to become the default."),
6752 	
6753 	    Option("rgw_log_http_headers", Option::TYPE_STR, Option::LEVEL_BASIC)
6754 	    .set_default("")
6755 	    .set_description("List of HTTP headers to log")
6756 	    .set_long_description(
6757 	        "A comma delimited list of HTTP headers to log when seen, ignores case (e.g., "
6758 	        "http_x_forwarded_for)."),
6759 	
6760 	    Option("rgw_num_async_rados_threads", Option::TYPE_INT, Option::LEVEL_ADVANCED)
6761 	    .set_default(32)
6762 	    .set_description("Number of concurrent RADOS operations in multisite sync")
6763 	    .set_long_description(
6764 	        "The number of concurrent RADOS IO operations that will be triggered for handling "
6765 	        "multisite sync operations. This includes control related work, and not the actual "
6766 	        "sync operations."),
6767 	
6768 	    Option("rgw_md_notify_interval_msec", Option::TYPE_INT, Option::LEVEL_ADVANCED)
6769 	    .set_default(200)
6770 	    .set_description("Length of time to aggregate metadata changes")
6771 	    .set_long_description(
6772 	        "Length of time (in milliseconds) in which the master zone aggregates all the "
6773 	        "metadata changes that occurred, before sending notifications to all the other "
6774 	        "zones."),
6775 	
6776 	    Option("rgw_run_sync_thread", Option::TYPE_BOOL, Option::LEVEL_ADVANCED)
6777 	    .set_default(true)
6778 	    .set_description("Should run sync thread"),
6779 	
6780 	    Option("rgw_sync_lease_period", Option::TYPE_INT, Option::LEVEL_DEV)
6781 	    .set_default(120)
6782 	    .set_description(""),
6783 	
6784 	    Option("rgw_sync_log_trim_interval", Option::TYPE_INT, Option::LEVEL_ADVANCED)
6785 	    .set_default(1200)
6786 	    .set_description("Sync log trim interval")
6787 	    .set_long_description(
6788 	        "Time in seconds between attempts to trim sync logs."),
6789 	
6790 	    Option("rgw_sync_log_trim_max_buckets", Option::TYPE_INT, Option::LEVEL_ADVANCED)
6791 	    .set_default(16)
6792 	    .set_description("Maximum number of buckets to trim per interval")
6793 	    .set_long_description("The maximum number of buckets to consider for bucket index log trimming each trim interval, regardless of the number of bucket index shards. Priority is given to buckets with the most sync activity over the last trim interval.")
6794 	    .add_see_also("rgw_sync_log_trim_interval")
6795 	    .add_see_also("rgw_sync_log_trim_min_cold_buckets")
6796 	    .add_see_also("rgw_sync_log_trim_concurrent_buckets"),
6797 	
6798 	    Option("rgw_sync_log_trim_min_cold_buckets", Option::TYPE_INT, Option::LEVEL_ADVANCED)
6799 	    .set_default(4)
6800 	    .set_description("Minimum number of cold buckets to trim per interval")
6801 	    .set_long_description("Of the `rgw_sync_log_trim_max_buckets` selected for bucket index log trimming each trim interval, at least this many of them must be 'cold' buckets. These buckets are selected in order from the list of all bucket instances, to guarantee that all buckets will be visited eventually.")
6802 	    .add_see_also("rgw_sync_log_trim_interval")
6803 	    .add_see_also("rgw_sync_log_trim_max_buckets")
6804 	    .add_see_also("rgw_sync_log_trim_concurrent_buckets"),
6805 	
6806 	    Option("rgw_sync_log_trim_concurrent_buckets", Option::TYPE_INT, Option::LEVEL_ADVANCED)
6807 	    .set_default(4)
6808 	    .set_description("Maximum number of buckets to trim in parallel")
6809 	    .add_see_also("rgw_sync_log_trim_interval")
6810 	    .add_see_also("rgw_sync_log_trim_max_buckets")
6811 	    .add_see_also("rgw_sync_log_trim_min_cold_buckets"),
6812 	
6813 	    Option("rgw_sync_data_inject_err_probability", Option::TYPE_FLOAT, Option::LEVEL_DEV)
6814 	    .set_default(0)
6815 	    .set_description(""),
6816 	
6817 	    Option("rgw_sync_meta_inject_err_probability", Option::TYPE_FLOAT, Option::LEVEL_DEV)
6818 	    .set_default(0)
6819 	    .set_description(""),
6820 	
6821 	    Option("rgw_sync_trace_history_size", Option::TYPE_SIZE, Option::LEVEL_ADVANCED)
6822 	    .set_default(4096)
6823 	    .set_description("Sync trace history size")
6824 	    .set_long_description(
6825 	      "Maximum number of complete sync trace entries to keep."),
6826 	
6827 	    Option("rgw_sync_trace_per_node_log_size", Option::TYPE_INT, Option::LEVEL_ADVANCED)
6828 	    .set_default(32)
6829 	    .set_description("Sync trace per-node log size")
6830 	    .set_long_description(
6831 	        "The number of log entries to keep per sync-trace node."),
6832 	
6833 	    Option("rgw_sync_trace_servicemap_update_interval", Option::TYPE_INT, Option::LEVEL_ADVANCED)
6834 	    .set_default(10)
6835 	    .set_description("Sync-trace service-map update interval")
6836 	    .set_long_description(
6837 	        "Number of seconds between service-map updates of sync-trace events."),
6838 	
6839 	    Option("rgw_period_push_interval", Option::TYPE_FLOAT, Option::LEVEL_ADVANCED)
6840 	    .set_default(2)
6841 	    .set_description("Period push interval")
6842 	    .set_long_description(
6843 	        "Number of seconds to wait before retrying 'period push' operation."),
6844 	
6845 	    Option("rgw_period_push_interval_max", Option::TYPE_FLOAT, Option::LEVEL_ADVANCED)
6846 	    .set_default(30)
6847 	    .set_description("Period push maximum interval")
6848 	    .set_long_description(
6849 	        "The max number of seconds to wait before retrying 'period push' after exponential "
6850 	        "backoff."),
6851 	
6852 	    Option("rgw_safe_max_objects_per_shard", Option::TYPE_INT, Option::LEVEL_ADVANCED)
6853 	    .set_default(100*1024)
6854 	    .set_description("Safe number of objects per shard")
6855 	    .set_long_description(
6856 	        "This is the max number of objects per bucket index shard that RGW considers "
6857 	        "safe. RGW will warn if it identifies a bucket where its per-shard count is "
6858 	        "higher than a percentage of this number.")
6859 	    .add_see_also("rgw_shard_warning_threshold"),
6860 	
6861 	    Option("rgw_shard_warning_threshold", Option::TYPE_FLOAT, Option::LEVEL_ADVANCED)
6862 	    .set_default(90)
6863 	    .set_description("Warn about max objects per shard")
6864 	    .set_long_description(
6865 	        "Warn if number of objects per shard in a specific bucket passed this percentage "
6866 	        "of the safe number.")
6867 	    .add_see_also("rgw_safe_max_objects_per_shard"),
6868 	
6869 	    Option("rgw_swift_versioning_enabled", Option::TYPE_BOOL, Option::LEVEL_ADVANCED)
6870 	    .set_default(false)
6871 	    .set_description("Enable Swift versioning"),
6872 	
6873 	    Option("rgw_swift_custom_header", Option::TYPE_STR, Option::LEVEL_ADVANCED)
6874 	    .set_default("")
6875 	    .set_description("Enable swift custom header")
6876 	    .set_long_description(
6877 	        "If not empty, specifies a name of HTTP header that can include custom data. When "
6878 	        "uploading an object, if this header is passed RGW will store this header info "
6879 	        "and it will be available when listing the bucket."),
6880 	
6881 	    Option("rgw_swift_need_stats", Option::TYPE_BOOL, Option::LEVEL_ADVANCED)
6882 	    .set_default(true)
6883 	    .set_description("Enable stats on bucket listing in Swift"),
6884 	
6885 	    Option("rgw_reshard_num_logs", Option::TYPE_UINT, Option::LEVEL_ADVANCED)
6886 	    .set_default(16)
6887 	    .set_min(1)
6888 	    .set_description("")
6889 	    .add_service("rgw"),
6890 	
6891 	    Option("rgw_reshard_bucket_lock_duration", Option::TYPE_UINT, Option::LEVEL_ADVANCED)
6892 	    .set_default(360)
6893 	    .set_min(30)
6894 	    .set_description("Number of seconds the timeout on the reshard locks (bucket reshard lock and reshard log lock) are set to. As a reshard proceeds these locks can be renewed/extended. If too short, reshards cannot complete and will fail, causing a future reshard attempt. If too long a hung or crashed reshard attempt will keep the bucket locked for an extended period, not allowing RGW to detect the failed reshard attempt and recover.")
6895 	    .add_tag("performance")
6896 	    .add_service("rgw"),
6897 	    
6898 	    Option("rgw_reshard_batch_size", Option::TYPE_UINT, Option::LEVEL_ADVANCED)
6899 	    .set_default(64)
6900 	    .set_min(8)
6901 	    .set_description("Number of reshard entries to batch together before sending the operations to the CLS back-end")
6902 	    .add_tag("performance")
6903 	    .add_service("rgw"),
6904 	
6905 	    Option("rgw_reshard_max_aio", Option::TYPE_UINT, Option::LEVEL_ADVANCED)
6906 	    .set_default(128)
6907 	    .set_min(16)
6908 	    .set_description("Maximum number of outstanding asynchronous I/O operations to allow at a time during resharding")
6909 	    .add_tag("performance")
6910 	    .add_service("rgw"),
6911 	
6912 	    Option("rgw_trust_forwarded_https", Option::TYPE_BOOL, Option::LEVEL_ADVANCED)
6913 	    .set_default(false)
6914 	    .set_description("Trust Forwarded and X-Forwarded-Proto headers")
6915 	    .set_long_description(
6916 	        "When a proxy in front of radosgw is used for ssl termination, radosgw "
6917 	        "does not know whether incoming http connections are secure. Enable "
6918 	        "this option to trust the Forwarded and X-Forwarded-Proto headers sent "
6919 	        "by the proxy when determining whether the connection is secure. This "
6920 	        "is required for some features, such as server side encryption.")
6921 	    .add_see_also("rgw_crypt_require_ssl"),
6922 	
6923 	    Option("rgw_crypt_require_ssl", Option::TYPE_BOOL, Option::LEVEL_ADVANCED)
6924 	    .set_default(true)
6925 	    .set_description("Requests including encryption key headers must be sent over ssl"),
6926 	
6927 	    Option("rgw_crypt_default_encryption_key", Option::TYPE_STR, Option::LEVEL_DEV)
6928 	    .set_default("")
6929 	    .set_description(""),
6930 	
6931 	    Option("rgw_crypt_s3_kms_backend", Option::TYPE_STR, Option::LEVEL_ADVANCED)
6932 	    .set_default("barbican")
6933 	    .set_enum_allowed({"barbican", "vault", "testing"})
6934 	    .set_description(
6935 	        "Where the SSE-KMS encryption keys are stored. Supported KMS "
6936 	        "systems are OpenStack Barbican ('barbican', the default) and HashiCorp "
6937 	        "Vault ('vault')."),
6938 	
6939 	    Option("rgw_crypt_s3_kms_encryption_keys", Option::TYPE_STR, Option::LEVEL_DEV)
6940 	    .set_default("")
6941 	    .set_description(""),
6942 	
6943 	    Option("rgw_crypt_vault_auth", Option::TYPE_STR, Option::LEVEL_ADVANCED)
6944 	    .set_default("token")
6945 	    .set_enum_allowed({"token"})
6946 	    .set_description(
6947 	        "Type of authentication method to be used with Vault. "
6948 	        "The only currently supported method is 'token'.")
6949 	    .add_see_also({
6950 	        "rgw_crypt_s3_kms_backend",
6951 	        "rgw_crypt_vault_addr",
6952 	        "rgw_crypt_vault_token_file"}),
6953 	
6954 	    Option("rgw_crypt_vault_token_file", Option::TYPE_STR, Option::LEVEL_ADVANCED)
6955 	    .set_default("")
6956 	    .set_description(
6957 	        "If authentication method is 'token', provide a path to the token file, "
6958 	        "which for security reasons should readable only by Rados Gateway.")
6959 	    .add_see_also({
6960 	      "rgw_crypt_s3_kms_backend",
6961 	      "rgw_crypt_vault_auth",
6962 	      "rgw_crypt_vault_addr"}),
6963 	
6964 	    Option("rgw_crypt_vault_addr", Option::TYPE_STR, Option::LEVEL_ADVANCED)
6965 	    .set_default("")
6966 	    .set_description("Base URL to the Vault server.")
6967 	    .add_see_also({
6968 	      "rgw_crypt_s3_kms_backend",
6969 	      "rgw_crypt_vault_auth",
6970 	      "rgw_crypt_vault_token_file"}),
6971 	
6972 	    Option("rgw_crypt_suppress_logs", Option::TYPE_BOOL, Option::LEVEL_ADVANCED)
6973 	    .set_default(true)
6974 	    .set_description("Suppress logs that might print client key"),
6975 	
6976 	    Option("rgw_list_bucket_min_readahead", Option::TYPE_INT, Option::LEVEL_ADVANCED)
6977 	    .set_default(1000)
6978 	    .set_description("Minimum number of entries to request from rados for bucket listing"),
6979 	
6980 	    Option("rgw_rest_getusage_op_compat", Option::TYPE_BOOL, Option::LEVEL_ADVANCED)
6981 	    .set_default(false)
6982 	    .set_description("REST GetUsage request backward compatibility"),
6983 	
6984 	    Option("rgw_torrent_flag", Option::TYPE_BOOL, Option::LEVEL_ADVANCED)
6985 	    .set_default(false)
6986 	    .set_description("When true, uploaded objects will calculate and store "
6987 	                     "a SHA256 hash of object data so the object can be "
6988 	                     "retrieved as a torrent file"),
6989 	
6990 	    Option("rgw_torrent_tracker", Option::TYPE_STR, Option::LEVEL_ADVANCED)
6991 	    .set_default("")
6992 	    .set_description("Torrent field announce and announce list"),
6993 	
6994 	    Option("rgw_torrent_createby", Option::TYPE_STR, Option::LEVEL_ADVANCED)
6995 	    .set_default("")
6996 	    .set_description("torrent field created by"),
6997 	
6998 	    Option("rgw_torrent_comment", Option::TYPE_STR, Option::LEVEL_ADVANCED)
6999 	    .set_default("")
7000 	    .set_description("Torrent field comment"),
7001 	
7002 	    Option("rgw_torrent_encoding", Option::TYPE_STR, Option::LEVEL_ADVANCED)
7003 	    .set_default("")
7004 	    .set_description("torrent field encoding"),
7005 	
7006 	    Option("rgw_data_notify_interval_msec", Option::TYPE_INT, Option::LEVEL_ADVANCED)
7007 	    .set_default(200)
7008 	    .set_description("data changes notification interval to followers"),
7009 	
7010 	    Option("rgw_torrent_origin", Option::TYPE_STR, Option::LEVEL_ADVANCED)
7011 	    .set_default("")
7012 	    .set_description("Torrent origin"),
7013 	
7014 	    Option("rgw_torrent_sha_unit", Option::TYPE_SIZE, Option::LEVEL_ADVANCED)
7015 	    .set_default(512*1024)
7016 	    .set_description(""),
7017 	
7018 	    Option("rgw_dynamic_resharding", Option::TYPE_BOOL, Option::LEVEL_BASIC)
7019 	    .set_default(true)
7020 	    .set_description("Enable dynamic resharding")
7021 	    .set_long_description(
7022 	        "If true, RGW will dynamicall increase the number of shards in buckets that have "
7023 	        "a high number of objects per shard.")
7024 	    .add_see_also("rgw_max_objs_per_shard"),
7025 	
7026 	    Option("rgw_max_objs_per_shard", Option::TYPE_UINT, Option::LEVEL_BASIC)
7027 	    .set_default(100000)
7028 	    .set_description("Max objects per shard for dynamic resharding")
7029 	    .set_long_description(
7030 	        "This is the max number of objects per bucket index shard that RGW will "
7031 	        "allow with dynamic resharding. RGW will trigger an automatic reshard operation "
7032 	        "on the bucket if it exceeds this number.")
7033 	    .add_see_also("rgw_dynamic_resharding"),
7034 	
7035 	    Option("rgw_reshard_thread_interval", Option::TYPE_UINT, Option::LEVEL_ADVANCED)
7036 	    .set_default(10_min)
7037 	    .set_min(10)
7038 	    .set_description("Number of seconds between processing of reshard log entries"),
7039 	
7040 	    Option("rgw_cache_expiry_interval", Option::TYPE_UINT,
7041 		   Option::LEVEL_ADVANCED)
7042 	    .set_default(15_min)
7043 	    .set_description("Number of seconds before entries in the cache are "
7044 			     "assumed stale and re-fetched. Zero is never.")
7045 	    .add_tag("performance")
7046 	    .add_service("rgw")
7047 	    .set_long_description("The Rados Gateway stores metadata and objects in "
7048 				  "an internal cache. This should be kept consistent "
7049 				  "by the OSD's relaying notify events between "
7050 				  "multiple watching RGW processes. In the event "
7051 				  "that this notification protocol fails, bounding "
7052 				  "the length of time that any data in the cache will "
7053 				  "be assumed valid will ensure that any RGW instance "
7054 				  "that falls out of sync will eventually recover. "
7055 				  "This seems to be an issue mostly for large numbers "
7056 				  "of RGW instances under heavy use. If you would like "
7057 				  "to turn off cache expiry, set this value to zero."),
7058 	
7059 	    Option("rgw_inject_notify_timeout_probability", Option::TYPE_FLOAT,
7060 		   Option::LEVEL_DEV)
7061 	    .set_default(0)
7062 	    .add_tag("fault injection")
7063 	    .add_tag("testing")
7064 	    .add_service("rgw")
7065 	    .set_min_max(0.0, 1.0)
7066 	    .set_description("Likelihood of ignoring a notify")
7067 	    .set_long_description("This is the probability that the RGW cache will "
7068 				  "ignore a cache notify message. It exists to help "
7069 				  "with the development and testing of cache "
7070 				  "consistency and recovery improvements. Please "
7071 				  "do not set it in a production cluster, as it "
7072 				  "actively causes failures. Set this to a floating "
7073 				  "point value between 0 and 1."),
7074 	    Option("rgw_max_notify_retries", Option::TYPE_UINT,
7075 		   Option::LEVEL_ADVANCED)
7076 	    .set_default(3)
7077 	    .add_tag("error recovery")
7078 	    .add_service("rgw")
7079 	    .set_description("Number of attempts to notify peers before giving up.")
7080 	    .set_long_description("The number of times we will attempt to update "
7081 				  "a peer's cache in the event of error before giving "
7082 				  "up. This is unlikely to be an issue unless your "
7083 				  "cluster is very heavily loaded. Beware that "
7084 				  "increasing this value may cause some operations to "
7085 				  "take longer in exceptional cases and thus may, "
7086 				  "rarely, cause clients to time out."),
7087 	    Option("rgw_sts_entry", Option::TYPE_STR, Option::LEVEL_ADVANCED)
7088 	    .set_default("sts")
7089 	    .set_description("STS URL prefix")
7090 	    .set_long_description("URL path prefix for internal STS requests."),
7091 	
7092 	    Option("rgw_sts_key", Option::TYPE_STR, Option::LEVEL_ADVANCED)
7093 	    .set_default("sts")
7094 	    .set_description("STS Key")
7095 	    .set_long_description("Key used for encrypting/ decrypting session token."),
7096 	
7097 	    Option("rgw_s3_auth_use_sts", Option::TYPE_BOOL, Option::LEVEL_ADVANCED)
7098 	    .set_default(false)
7099 	    .set_description("Should S3 authentication use STS."),
7100 	
7101 	    Option("rgw_sts_max_session_duration", Option::TYPE_UINT, Option::LEVEL_ADVANCED)
7102 	    .set_default(43200)
7103 	    .set_description("Session token max duration")
7104 	    .set_long_description("Max duration in seconds for which the session token is valid."),
7105 	
7106 	    Option("rgw_max_listing_results", Option::TYPE_UINT,
7107 		   Option::LEVEL_ADVANCED)
7108 	    .set_default(1000)
7109 	    .set_min_max(1, 100000)
7110 	    .add_service("rgw")
7111 	    .set_description("Upper bound on results in listing operations, ListBucket max-keys")
7112 	    .set_long_description("This caps the maximum permitted value for listing-like operations in RGW S3. "
7113 				  "Affects ListBucket(max-keys), "
7114 				  "ListBucketVersions(max-keys), "
7115 				  "ListBucketMultipartUploads(max-uploads), "
7116 				  "ListMultipartUploadParts(max-parts)"),
7117 	
7118 	    Option("rgw_sts_token_introspection_url", Option::TYPE_STR, Option::LEVEL_ADVANCED)
7119 	    .set_default("")
7120 	    .set_description("STS Web Token introspection URL")
7121 	    .set_long_description("URL for introspecting an STS Web Token."),
7122 	
7123 	    Option("rgw_sts_client_id", Option::TYPE_STR, Option::LEVEL_ADVANCED)
7124 	    .set_default("")
7125 	    .set_description("Client Id")
7126 	    .set_long_description("Client Id needed for introspecting a Web Token."),
7127 	
7128 	    Option("rgw_sts_client_secret", Option::TYPE_STR, Option::LEVEL_ADVANCED)
7129 	    .set_default("")
7130 	    .set_description("Client Secret")
7131 	    .set_long_description("Client Secret needed for introspecting a Web Token."),
7132 	
7133 	    Option("rgw_max_concurrent_requests", Option::TYPE_INT, Option::LEVEL_BASIC)
7134 	    .set_default(1024)
7135 	    .set_description("Maximum number of concurrent HTTP requests.")
7136 	    .set_long_description(
7137 	        "Maximum number of concurrent HTTP requests that the beast frontend "
7138 	        "will process. Tuning this can help to limit memory usage under heavy "
7139 	        "load.")
7140 	    .add_tag("performance")
7141 	    .add_see_also("rgw_frontends"),
7142 	
7143 	    Option("rgw_scheduler_type", Option::TYPE_STR, Option::LEVEL_ADVANCED)
7144 	    .set_default("throttler")
7145 	    .set_description("Set the type of dmclock scheduler, defaults to throttler "
7146 			     "Other valid values are dmclock which is experimental"),
7147 	
7148 	    Option("rgw_dmclock_admin_res", Option::TYPE_FLOAT, Option::LEVEL_ADVANCED)
7149 	    .set_default(100.0)
7150 	    .set_description("mclock reservation for admin requests")
7151 	    .add_see_also("rgw_dmclock_admin_wgt")
7152 	    .add_see_also("rgw_dmclock_admin_lim"),
7153 	
7154 	    Option("rgw_dmclock_admin_wgt", Option::TYPE_FLOAT, Option::LEVEL_ADVANCED)
7155 	    .set_default(100.0)
7156 	    .set_description("mclock weight for admin requests")
7157 	    .add_see_also("rgw_dmclock_admin_res")
7158 	    .add_see_also("rgw_dmclock_admin_lim"),
7159 	
7160 	    Option("rgw_dmclock_admin_lim", Option::TYPE_FLOAT, Option::LEVEL_ADVANCED)
7161 	    .set_default(0.0)
7162 	    .set_description("mclock limit for admin requests")
7163 	    .add_see_also("rgw_dmclock_admin_res")
7164 	    .add_see_also("rgw_dmclock_admin_wgt"),
7165 	
7166 	    Option("rgw_dmclock_auth_res", Option::TYPE_FLOAT, Option::LEVEL_ADVANCED)
7167 	    .set_default(200.0)
7168 	    .set_description("mclock reservation for object data requests")
7169 	    .add_see_also("rgw_dmclock_auth_wgt")
7170 	    .add_see_also("rgw_dmclock_auth_lim"),
7171 	
7172 	    Option("rgw_dmclock_auth_wgt", Option::TYPE_FLOAT, Option::LEVEL_ADVANCED)
7173 	    .set_default(100.0)
7174 	    .set_description("mclock weight for object data requests")
7175 	    .add_see_also("rgw_dmclock_auth_res")
7176 	    .add_see_also("rgw_dmclock_auth_lim"),
7177 	
7178 	    Option("rgw_dmclock_auth_lim", Option::TYPE_FLOAT, Option::LEVEL_ADVANCED)
7179 	    .set_default(0.0)
7180 	    .set_description("mclock limit for object data requests")
7181 	    .add_see_also("rgw_dmclock_auth_res")
7182 	    .add_see_also("rgw_dmclock_auth_wgt"),
7183 	
7184 	    Option("rgw_dmclock_data_res", Option::TYPE_FLOAT, Option::LEVEL_ADVANCED)
7185 	    .set_default(500.0)
7186 	    .set_description("mclock reservation for object data requests")
7187 	    .add_see_also("rgw_dmclock_data_wgt")
7188 	    .add_see_also("rgw_dmclock_data_lim"),
7189 	
7190 	    Option("rgw_dmclock_data_wgt", Option::TYPE_FLOAT, Option::LEVEL_ADVANCED)
7191 	    .set_default(500.0)
7192 	    .set_description("mclock weight for object data requests")
7193 	    .add_see_also("rgw_dmclock_data_res")
7194 	    .add_see_also("rgw_dmclock_data_lim"),
7195 	
7196 	    Option("rgw_dmclock_data_lim", Option::TYPE_FLOAT, Option::LEVEL_ADVANCED)
7197 	    .set_default(0.0)
7198 	    .set_description("mclock limit for object data requests")
7199 	    .add_see_also("rgw_dmclock_data_res")
7200 	    .add_see_also("rgw_dmclock_data_wgt"),
7201 	
7202 	    Option("rgw_dmclock_metadata_res", Option::TYPE_FLOAT, Option::LEVEL_ADVANCED)
7203 	    .set_default(500.0)
7204 	    .set_description("mclock reservation for metadata requests")
7205 	    .add_see_also("rgw_dmclock_metadata_wgt")
7206 	    .add_see_also("rgw_dmclock_metadata_lim"),
7207 	
7208 	    Option("rgw_dmclock_metadata_wgt", Option::TYPE_FLOAT, Option::LEVEL_ADVANCED)
7209 	    .set_default(500.0)
7210 	    .set_description("mclock weight for metadata requests")
7211 	    .add_see_also("rgw_dmclock_metadata_res")
7212 	    .add_see_also("rgw_dmclock_metadata_lim"),
7213 	
7214 	    Option("rgw_dmclock_metadata_lim", Option::TYPE_FLOAT, Option::LEVEL_ADVANCED)
7215 	    .set_default(0.0)
7216 	    .set_description("mclock limit for metadata requests")
7217 	    .add_see_also("rgw_dmclock_metadata_res")
7218 	    .add_see_also("rgw_dmclock_metadata_wgt"),
7219 	
7220 	  });
7221 	}
7222 	
7223 	static std::vector<Option> get_rbd_options() {
7224 	  return std::vector<Option>({
7225 	    Option("rbd_default_pool", Option::TYPE_STR, Option::LEVEL_ADVANCED)
7226 	    .set_default("rbd")
7227 	    .set_description("default pool for storing new images")
7228 	    .set_validator([](std::string *value, std::string *error_message){
7229 	      std::regex pattern("^[^@/]+$");
7230 	      if (!std::regex_match (*value, pattern)) {
7231 	        *value = "rbd";
7232 	        *error_message = "invalid RBD default pool, resetting to 'rbd'";
7233 	      }
7234 	      return 0;
7235 	    }),
7236 	
7237 	    Option("rbd_default_data_pool", Option::TYPE_STR, Option::LEVEL_ADVANCED)
7238 	    .set_default("")
7239 	    .set_description("default pool for storing data blocks for new images")
7240 	    .set_validator([](std::string *value, std::string *error_message){
7241 	      std::regex pattern("^[^@/]*$");
7242 	      if (!std::regex_match (*value, pattern)) {
7243 	        *value = "";
7244 	        *error_message = "ignoring invalid RBD data pool";
7245 	      }
7246 	      return 0;
7247 	    }),
7248 	
7249 	    Option("rbd_default_features", Option::TYPE_STR, Option::LEVEL_ADVANCED)
7250 	    .set_default("layering,exclusive-lock,object-map,fast-diff,deep-flatten")
7251 	    .set_description("default v2 image features for new images")
7252 	    .set_long_description(
7253 	        "RBD features are only applicable for v2 images. This setting accepts "
7254 	        "either an integer bitmask value or comma-delimited string of RBD "
7255 	        "feature names. This setting is always internally stored as an integer "
7256 	        "bitmask value. The mapping between feature bitmask value and feature "
7257 	        "name is as follows: +1 -> layering, +2 -> striping, "
7258 	        "+4 -> exclusive-lock, +8 -> object-map, +16 -> fast-diff, "
7259 	        "+32 -> deep-flatten, +64 -> journaling, +128 -> data-pool")
7260 	    .set_flag(Option::FLAG_RUNTIME)
7261 	    .set_validator([](std::string *value, std::string *error_message) {
7262 		ostringstream ss;
7263 		uint64_t features = librbd::rbd_features_from_string(*value, &ss);
7264 		// Leave this in integer form to avoid breaking Cinder.  Someday
7265 		// we would like to present this in string form instead...
7266 		*value = stringify(features);
7267 		if (ss.str().size()) {
7268 		  return -EINVAL;
7269 		}
7270 		return 0;
7271 	      }),
7272 	
7273 	    Option("rbd_op_threads", Option::TYPE_UINT, Option::LEVEL_ADVANCED)
7274 	    .set_default(1)
7275 	    .set_description("number of threads to utilize for internal processing"),
7276 	
7277 	    Option("rbd_op_thread_timeout", Option::TYPE_UINT, Option::LEVEL_ADVANCED)
7278 	    .set_default(60)
7279 	    .set_description("time in seconds for detecting a hung thread"),
7280 	
7281 	    Option("rbd_non_blocking_aio", Option::TYPE_BOOL, Option::LEVEL_ADVANCED)
7282 	    .set_default(true)
7283 	    .set_description("process AIO ops from a dispatch thread to prevent blocking"),
7284 	
7285 	    Option("rbd_cache", Option::TYPE_BOOL, Option::LEVEL_ADVANCED)
7286 	    .set_default(true)
7287 	    .set_description("whether to enable caching (writeback unless rbd_cache_max_dirty is 0)"),
7288 	
7289 	    Option("rbd_cache_policy", Option::TYPE_STR, Option::LEVEL_ADVANCED)
7290 	    .set_enum_allowed({"writethrough", "writeback", "writearound"})
7291 	    .set_default("writearound")
7292 	    .set_description("cache policy for handling writes."),
7293 	
7294 	    Option("rbd_cache_writethrough_until_flush", Option::TYPE_BOOL, Option::LEVEL_ADVANCED)
7295 	    .set_default(true)
7296 	    .set_description("whether to make writeback caching writethrough until "
7297 	                     "flush is called, to be sure the user of librbd will send "
7298 	                     "flushes so that writeback is safe"),
7299 	
7300 	    Option("rbd_cache_size", Option::TYPE_SIZE, Option::LEVEL_ADVANCED)
7301 	    .set_default(32_M)
7302 	    .set_description("cache size in bytes"),
7303 	
7304 	    Option("rbd_cache_max_dirty", Option::TYPE_SIZE, Option::LEVEL_ADVANCED)
7305 	    .set_default(24_M)
7306 	    .set_description("dirty limit in bytes - set to 0 for write-through caching"),
7307 	
7308 	    Option("rbd_cache_target_dirty", Option::TYPE_SIZE, Option::LEVEL_ADVANCED)
7309 	    .set_default(16_M)
7310 	    .set_description("target dirty limit in bytes"),
7311 	
7312 	    Option("rbd_cache_max_dirty_age", Option::TYPE_FLOAT, Option::LEVEL_ADVANCED)
7313 	    .set_default(1.0)
7314 	    .set_description("seconds in cache before writeback starts"),
7315 	
7316 	    Option("rbd_cache_max_dirty_object", Option::TYPE_UINT, Option::LEVEL_ADVANCED)
7317 	    .set_default(0)
7318 	    .set_description("dirty limit for objects - set to 0 for auto calculate from rbd_cache_size"),
7319 	
7320 	    Option("rbd_cache_block_writes_upfront", Option::TYPE_BOOL, Option::LEVEL_ADVANCED)
7321 	    .set_default(false)
7322 	    .set_description("whether to block writes to the cache before the aio_write call completes"),
7323 	
7324 	    Option("rbd_parent_cache_enabled", Option::TYPE_BOOL, Option::LEVEL_ADVANCED)
7325 	    .set_default(false)
7326 	    .set_description("whether to enable rbd shared ro cache"),
7327 	
7328 	    Option("rbd_concurrent_management_ops", Option::TYPE_UINT, Option::LEVEL_ADVANCED)
7329 	    .set_default(10)
7330 	    .set_min(1)
7331 	    .set_description("how many operations can be in flight for a management operation like deleting or resizing an image"),
7332 	
7333 	    Option("rbd_balance_snap_reads", Option::TYPE_BOOL, Option::LEVEL_ADVANCED)
7334 	    .set_default(false)
7335 	    .set_description("distribute snap read requests to random OSD"),
7336 	
7337 	    Option("rbd_localize_snap_reads", Option::TYPE_BOOL, Option::LEVEL_ADVANCED)
7338 	    .set_default(false)
7339 	    .set_description("localize snap read requests to closest OSD"),
7340 	
7341 	    Option("rbd_balance_parent_reads", Option::TYPE_BOOL, Option::LEVEL_ADVANCED)
7342 	    .set_default(false)
7343 	    .set_description("distribute parent read requests to random OSD"),
7344 	
7345 	    Option("rbd_localize_parent_reads", Option::TYPE_BOOL, Option::LEVEL_ADVANCED)
7346 	    .set_default(false)
7347 	    .set_description("localize parent requests to closest OSD"),
7348 	
7349 	    Option("rbd_sparse_read_threshold_bytes", Option::TYPE_SIZE,
7350 	           Option::LEVEL_ADVANCED)
7351 	    .set_default(64_K)
7352 	    .set_description("threshold for issuing a sparse-read")
7353 	    .set_long_description("minimum number of sequential bytes to read against "
7354 	                          "an object before issuing a sparse-read request to "
7355 	                          "the cluster. 0 implies it must be a full object read "
7356 	                          "to issue a sparse-read, 1 implies always use "
7357 	                          "sparse-read, and any value larger than the maximum "
7358 	                          "object size will disable sparse-read for all "
7359 	                          "requests"),
7360 	
7361 	    Option("rbd_readahead_trigger_requests", Option::TYPE_UINT, Option::LEVEL_ADVANCED)
7362 	    .set_default(10)
7363 	    .set_description("number of sequential requests necessary to trigger readahead"),
7364 	
7365 	    Option("rbd_readahead_max_bytes", Option::TYPE_SIZE, Option::LEVEL_ADVANCED)
7366 	    .set_default(512_K)
7367 	    .set_description("set to 0 to disable readahead"),
7368 	
7369 	    Option("rbd_readahead_disable_after_bytes", Option::TYPE_SIZE, Option::LEVEL_ADVANCED)
7370 	    .set_default(50_M)
7371 	    .set_description("how many bytes are read in total before readahead is disabled"),
7372 	
7373 	    Option("rbd_clone_copy_on_read", Option::TYPE_BOOL, Option::LEVEL_ADVANCED)
7374 	    .set_default(false)
7375 	    .set_description("copy-up parent image blocks to clone upon read request"),
7376 	
7377 	    Option("rbd_blacklist_on_break_lock", Option::TYPE_BOOL, Option::LEVEL_ADVANCED)
7378 	    .set_default(true)
7379 	    .set_description("whether to blacklist clients whose lock was broken"),
7380 	
7381 	    Option("rbd_blacklist_expire_seconds", Option::TYPE_UINT, Option::LEVEL_ADVANCED)
7382 	    .set_default(0)
7383 	    .set_description("number of seconds to blacklist - set to 0 for OSD default"),
7384 	
7385 	    Option("rbd_request_timed_out_seconds", Option::TYPE_UINT, Option::LEVEL_ADVANCED)
7386 	    .set_default(30)
7387 	    .set_description("number of seconds before maintenance request times out"),
7388 	
7389 	    Option("rbd_skip_partial_discard", Option::TYPE_BOOL, Option::LEVEL_ADVANCED)
7390 	    .set_default(true)
7391 	    .set_description("skip discard (zero) of unaligned extents within an object"),
7392 	
7393 	    Option("rbd_discard_granularity_bytes", Option::TYPE_UINT,
7394 	           Option::LEVEL_ADVANCED)
7395 	    .set_default(64_K)
7396 	    .set_min_max(4_K, 32_M)
7397 	    .set_validator([](std::string *value, std::string *error_message){
7398 	        uint64_t f = strict_si_cast<uint64_t>(value->c_str(), error_message);
7399 	        if (!error_message->empty()) {
7400 	          return -EINVAL;
7401 	        } else if (!isp2(f)) {
7402 	          *error_message = "value must be a power of two";
7403 	          return -EINVAL;
7404 	        }
7405 	        return 0;
7406 	      })
7407 	    .set_description("minimum aligned size of discard operations"),
7408 	
7409 	    Option("rbd_enable_alloc_hint", Option::TYPE_BOOL, Option::LEVEL_ADVANCED)
7410 	    .set_default(true)
7411 	    .set_description("when writing a object, it will issue a hint to osd backend to indicate the expected size object need"),
7412 	
7413 	    Option("rbd_tracing", Option::TYPE_BOOL, Option::LEVEL_ADVANCED)
7414 	    .set_default(false)
7415 	    .set_description("true if LTTng-UST tracepoints should be enabled"),
7416 	
7417 	    Option("rbd_blkin_trace_all", Option::TYPE_BOOL, Option::LEVEL_ADVANCED)
7418 	    .set_default(false)
7419 	    .set_description("create a blkin trace for all RBD requests"),
7420 	
7421 	    Option("rbd_validate_pool", Option::TYPE_BOOL, Option::LEVEL_ADVANCED)
7422 	    .set_default(true)
7423 	    .set_description("validate empty pools for RBD compatibility"),
7424 	
7425 	    Option("rbd_validate_names", Option::TYPE_BOOL, Option::LEVEL_ADVANCED)
7426 	    .set_default(true)
7427 	    .set_description("validate new image names for RBD compatibility"),
7428 	
7429 	    Option("rbd_auto_exclusive_lock_until_manual_request", Option::TYPE_BOOL, Option::LEVEL_ADVANCED)
7430 	    .set_default(true)
7431 	    .set_description("automatically acquire/release exclusive lock until it is explicitly requested"),
7432 	
7433 	    Option("rbd_move_to_trash_on_remove", Option::TYPE_BOOL, Option::LEVEL_BASIC)
7434 	    .set_default(false)
7435 	    .set_description("automatically move images to the trash when deleted"),
7436 	
7437 	    Option("rbd_move_to_trash_on_remove_expire_seconds", Option::TYPE_UINT, Option::LEVEL_BASIC)
7438 	    .set_default(0)
7439 	    .set_description("default number of seconds to protect deleted images in the trash"),
7440 	
7441 	    Option("rbd_move_parent_to_trash_on_remove", Option::TYPE_BOOL, Option::LEVEL_BASIC)
7442 	    .set_default(false)
7443 	    .set_description("move parent with clone format v2 children to the trash when deleted"),
7444 	
7445 	    Option("rbd_mirroring_resync_after_disconnect", Option::TYPE_BOOL, Option::LEVEL_ADVANCED)
7446 	    .set_default(false)
7447 	    .set_description("automatically start image resync after mirroring is disconnected due to being laggy"),
7448 	
7449 	    Option("rbd_mirroring_delete_delay", Option::TYPE_UINT, Option::LEVEL_ADVANCED)
7450 	    .set_default(0)
7451 	    .set_description("time-delay in seconds for rbd-mirror delete propagation"),
7452 	
7453 	    Option("rbd_mirroring_replay_delay", Option::TYPE_UINT, Option::LEVEL_ADVANCED)
7454 	    .set_default(0)
7455 	    .set_description("time-delay in seconds for rbd-mirror asynchronous replication"),
7456 	
7457 	    Option("rbd_default_format", Option::TYPE_UINT, Option::LEVEL_ADVANCED)
7458 	    .set_default(2)
7459 	    .set_description("default image format for new images"),
7460 	
7461 	    Option("rbd_default_order", Option::TYPE_UINT, Option::LEVEL_ADVANCED)
7462 	    .set_default(22)
7463 	    .set_description("default order (data block object size) for new images"),
7464 	
7465 	    Option("rbd_default_stripe_count", Option::TYPE_UINT, Option::LEVEL_ADVANCED)
7466 	    .set_default(0)
7467 	    .set_description("default stripe count for new images"),
7468 	
7469 	    Option("rbd_default_stripe_unit", Option::TYPE_SIZE, Option::LEVEL_ADVANCED)
7470 	    .set_default(0)
7471 	    .set_description("default stripe width for new images"),
7472 	
7473 	    Option("rbd_default_map_options", Option::TYPE_STR, Option::LEVEL_ADVANCED)
7474 	    .set_default("")
7475 	    .set_description("default krbd map options"),
7476 	
7477 	    Option("rbd_default_clone_format", Option::TYPE_STR, Option::LEVEL_ADVANCED)
7478 	    .set_enum_allowed({"1", "2", "auto"})
7479 	    .set_default("auto")
7480 	    .set_description("default internal format for handling clones")
7481 	    .set_long_description("This sets the internal format for tracking cloned "
7482 	                          "images. The setting of '1' requires attaching to "
7483 	                          "protected snapshots that cannot be removed until "
7484 	                          "the clone is removed/flattened. The setting of '2' "
7485 	                          "will allow clones to be attached to any snapshot "
7486 	                          "and permits removing in-use parent snapshots but "
7487 	                          "requires Mimic or later clients. The default "
7488 	                          "setting of 'auto' will use the v2 format if the "
7489 	                          "cluster is configured to require mimic or later "
7490 	                          "clients.")
7491 	    .set_flag(Option::FLAG_RUNTIME),
7492 	
7493 	    Option("rbd_journal_order", Option::TYPE_UINT, Option::LEVEL_ADVANCED)
7494 	    .set_min_max(12, 26)
7495 	    .set_default(24)
7496 	    .set_description("default order (object size) for journal data objects"),
7497 	
7498 	    Option("rbd_journal_splay_width", Option::TYPE_UINT, Option::LEVEL_ADVANCED)
7499 	    .set_default(4)
7500 	    .set_description("number of active journal objects"),
7501 	
7502 	    Option("rbd_journal_commit_age", Option::TYPE_FLOAT, Option::LEVEL_ADVANCED)
7503 	    .set_default(5)
7504 	    .set_description("commit time interval, seconds"),
7505 	
7506 	    Option("rbd_journal_object_writethrough_until_flush", Option::TYPE_BOOL, Option::LEVEL_ADVANCED)
7507 	    .set_default(true)
7508 	    .set_description("when enabled, the rbd_journal_object_flush* configuration "
7509 	                     "options are ignored until the first flush so that batched "
7510 	                     "journal IO is known to be safe for consistency"),
7511 	
7512 	    Option("rbd_journal_object_flush_interval", Option::TYPE_UINT, Option::LEVEL_ADVANCED)
7513 	    .set_default(0)
7514 	    .set_description("maximum number of pending commits per journal object"),
7515 	
7516 	    Option("rbd_journal_object_flush_bytes", Option::TYPE_SIZE, Option::LEVEL_ADVANCED)
7517 	    .set_default(1_M)
7518 	    .set_description("maximum number of pending bytes per journal object"),
7519 	
7520 	    Option("rbd_journal_object_flush_age", Option::TYPE_FLOAT, Option::LEVEL_ADVANCED)
7521 	    .set_default(0)
7522 	    .set_description("maximum age (in seconds) for pending commits"),
7523 	
7524 	    Option("rbd_journal_object_max_in_flight_appends", Option::TYPE_UINT, Option::LEVEL_ADVANCED)
7525 	    .set_default(0)
7526 	    .set_description("maximum number of in-flight appends per journal object"),
7527 	
7528 	    Option("rbd_journal_pool", Option::TYPE_STR, Option::LEVEL_ADVANCED)
7529 	    .set_default("")
7530 	    .set_description("pool for journal objects"),
7531 	
7532 	    Option("rbd_journal_max_payload_bytes", Option::TYPE_SIZE, Option::LEVEL_ADVANCED)
7533 	    .set_default(16384)
7534 	    .set_description("maximum journal payload size before splitting"),
7535 	
7536 	    Option("rbd_journal_max_concurrent_object_sets", Option::TYPE_UINT, Option::LEVEL_ADVANCED)
7537 	    .set_default(0)
7538 	    .set_description("maximum number of object sets a journal client can be behind before it is automatically unregistered"),
7539 	
7540 	    Option("rbd_qos_iops_limit", Option::TYPE_UINT, Option::LEVEL_ADVANCED)
7541 	    .set_default(0)
7542 	    .set_description("the desired limit of IO operations per second"),
7543 	
7544 	    Option("rbd_qos_bps_limit", Option::TYPE_UINT, Option::LEVEL_ADVANCED)
7545 	    .set_default(0)
7546 	    .set_description("the desired limit of IO bytes per second"),
7547 	
7548 	    Option("rbd_qos_read_iops_limit", Option::TYPE_UINT, Option::LEVEL_ADVANCED)
7549 	    .set_default(0)
7550 	    .set_description("the desired limit of read operations per second"),
7551 	
7552 	    Option("rbd_qos_write_iops_limit", Option::TYPE_UINT, Option::LEVEL_ADVANCED)
7553 	    .set_default(0)
7554 	    .set_description("the desired limit of write operations per second"),
7555 	
7556 	    Option("rbd_qos_read_bps_limit", Option::TYPE_UINT, Option::LEVEL_ADVANCED)
7557 	    .set_default(0)
7558 	    .set_description("the desired limit of read bytes per second"),
7559 	
7560 	    Option("rbd_qos_write_bps_limit", Option::TYPE_UINT, Option::LEVEL_ADVANCED)
7561 	    .set_default(0)
7562 	    .set_description("the desired limit of write bytes per second"),
7563 	
7564 	    Option("rbd_qos_iops_burst", Option::TYPE_UINT, Option::LEVEL_ADVANCED)
7565 	    .set_default(0)
7566 	    .set_description("the desired burst limit of IO operations"),
7567 	
7568 	    Option("rbd_qos_bps_burst", Option::TYPE_UINT, Option::LEVEL_ADVANCED)
7569 	    .set_default(0)
7570 	    .set_description("the desired burst limit of IO bytes"),
7571 	
7572 	    Option("rbd_qos_read_iops_burst", Option::TYPE_UINT, Option::LEVEL_ADVANCED)
7573 	    .set_default(0)
7574 	    .set_description("the desired burst limit of read operations"),
7575 	
7576 	    Option("rbd_qos_write_iops_burst", Option::TYPE_UINT, Option::LEVEL_ADVANCED)
7577 	    .set_default(0)
7578 	    .set_description("the desired burst limit of write operations"),
7579 	
7580 	    Option("rbd_qos_read_bps_burst", Option::TYPE_UINT, Option::LEVEL_ADVANCED)
7581 	    .set_default(0)
7582 	    .set_description("the desired burst limit of read bytes"),
7583 	
7584 	    Option("rbd_qos_write_bps_burst", Option::TYPE_UINT, Option::LEVEL_ADVANCED)
7585 	    .set_default(0)
7586 	    .set_description("the desired burst limit of write bytes"),
7587 	
7588 	    Option("rbd_qos_schedule_tick_min", Option::TYPE_UINT, Option::LEVEL_ADVANCED)
7589 	    .set_default(50)
7590 	    .set_min(1)
7591 	    .set_description("minimum schedule tick (in milliseconds) for QoS"),
7592 	
7593 	    Option("rbd_discard_on_zeroed_write_same", Option::TYPE_BOOL, Option::LEVEL_ADVANCED)
7594 	    .set_default(true)
7595 	    .set_description("discard data on zeroed write same instead of writing zero"),
7596 	
7597 	    Option("rbd_mtime_update_interval", Option::TYPE_UINT, Option::LEVEL_ADVANCED)
7598 	    .set_default(60)
7599 	    .set_min(0)
7600 	    .set_description("RBD Image modify timestamp refresh interval. Set to 0 to disable modify timestamp update."),
7601 	
7602 	    Option("rbd_atime_update_interval", Option::TYPE_UINT, Option::LEVEL_ADVANCED)
7603 	    .set_default(60)
7604 	    .set_min(0)
7605 	    .set_description("RBD Image access timestamp refresh interval. Set to 0 to disable access timestamp update."),
7606 	
7607 	    Option("rbd_io_scheduler", Option::TYPE_STR, Option::LEVEL_ADVANCED)
7608 	    .set_default("simple")
7609 	    .set_enum_allowed({"none", "simple"})
7610 	    .set_description("RBD IO scheduler"),
7611 	
7612 	    Option("rbd_io_scheduler_simple_max_delay", Option::TYPE_UINT, Option::LEVEL_ADVANCED)
7613 	    .set_default(0)
7614 	    .set_min(0)
7615 	    .set_description("maximum io delay (in milliseconds) for simple io scheduler (if set to 0 dalay is calculated based on latency stats)"),
7616 	  });
7617 	}
7618 	
7619 	static std::vector<Option> get_rbd_mirror_options() {
7620 	  return std::vector<Option>({
7621 	    Option("rbd_mirror_journal_commit_age", Option::TYPE_FLOAT, Option::LEVEL_ADVANCED)
7622 	    .set_default(5)
7623 	    .set_description("commit time interval, seconds"),
7624 	
7625 	    Option("rbd_mirror_journal_poll_age", Option::TYPE_FLOAT, Option::LEVEL_ADVANCED)
7626 	    .set_default(5)
7627 	    .set_description("maximum age (in seconds) between successive journal polls"),
7628 	
7629 	    Option("rbd_mirror_sync_point_update_age", Option::TYPE_FLOAT, Option::LEVEL_ADVANCED)
7630 	    .set_default(30)
7631 	    .set_description("number of seconds between each update of the image sync point object number"),
7632 	
7633 	    Option("rbd_mirror_concurrent_image_syncs", Option::TYPE_UINT, Option::LEVEL_ADVANCED)
7634 	    .set_default(5)
7635 	    .set_description("maximum number of image syncs in parallel"),
7636 	
7637 	    Option("rbd_mirror_pool_replayers_refresh_interval", Option::TYPE_UINT, Option::LEVEL_ADVANCED)
7638 	    .set_default(30)
7639 	    .set_description("interval to refresh peers in rbd-mirror daemon"),
7640 	
7641 	    Option("rbd_mirror_concurrent_image_deletions", Option::TYPE_UINT, Option::LEVEL_ADVANCED)
7642 	    .set_default(1)
7643 	    .set_min(1)
7644 	    .set_description("maximum number of image deletions in parallel"),
7645 	
7646 	    Option("rbd_mirror_delete_retry_interval", Option::TYPE_FLOAT, Option::LEVEL_ADVANCED)
7647 	    .set_default(30)
7648 	    .set_description("interval to check and retry the failed deletion requests"),
7649 	
7650 	    Option("rbd_mirror_image_state_check_interval", Option::TYPE_UINT, Option::LEVEL_ADVANCED)
7651 	    .set_default(30)
7652 	    .set_min(1)
7653 	    .set_description("interval to get images from pool watcher and set sources in replayer"),
7654 	
7655 	    Option("rbd_mirror_leader_heartbeat_interval", Option::TYPE_UINT, Option::LEVEL_ADVANCED)
7656 	    .set_default(5)
7657 	    .set_min(1)
7658 	    .set_description("interval (in seconds) between mirror leader heartbeats"),
7659 	
7660 	    Option("rbd_mirror_leader_max_missed_heartbeats", Option::TYPE_UINT, Option::LEVEL_ADVANCED)
7661 	    .set_default(2)
7662 	    .set_description("number of missed heartbeats for non-lock owner to attempt to acquire lock"),
7663 	
7664 	    Option("rbd_mirror_leader_max_acquire_attempts_before_break", Option::TYPE_UINT, Option::LEVEL_ADVANCED)
7665 	    .set_default(3)
7666 	    .set_description("number of failed attempts to acquire lock after missing heartbeats before breaking lock"),
7667 	
7668 	    Option("rbd_mirror_image_policy_type", Option::TYPE_STR, Option::LEVEL_ADVANCED)
7669 	    .set_default("simple")
7670 	    .set_enum_allowed({"none", "simple"})
7671 	    .set_description("active/active policy type for mapping images to instances"),
7672 	
7673 	    Option("rbd_mirror_image_policy_migration_throttle", Option::TYPE_UINT, Option::LEVEL_ADVANCED)
7674 	    .set_default(300)
7675 	    .set_description("number of seconds after which an image can be reshuffled (migrated) again"),
7676 	
7677 	    Option("rbd_mirror_image_policy_update_throttle_interval", Option::TYPE_FLOAT, Option::LEVEL_ADVANCED)
7678 	    .set_default(1)
7679 	    .set_min(1)
7680 	    .set_description("interval (in seconds) to throttle images for mirror daemon peer updates"),
7681 	
7682 	    Option("rbd_mirror_image_policy_rebalance_timeout", Option::TYPE_FLOAT, Option::LEVEL_ADVANCED)
7683 	    .set_default(0)
7684 	    .set_description("number of seconds policy should be idle before trigerring reshuffle (rebalance) of images"),
7685 	
7686 	    Option("rbd_mirror_perf_stats_prio", Option::TYPE_INT, Option::LEVEL_ADVANCED)
7687 	    .set_default((int64_t)PerfCountersBuilder::PRIO_USEFUL)
7688 	    .set_description("Priority level for mirror daemon replication perf counters")
7689 	    .set_long_description("The daemon will send perf counter data to the "
7690 	                          "manager daemon if the priority is not lower than "
7691 	                          "mgr_stats_threshold.")
7692 	    .set_min_max((int64_t)PerfCountersBuilder::PRIO_DEBUGONLY,
7693 	                 (int64_t)PerfCountersBuilder::PRIO_CRITICAL + 1),
7694 	
7695 	    Option("rbd_mirror_memory_autotune", Option::TYPE_BOOL, Option::LEVEL_DEV)
7696 	    .set_default(true)
7697 	    .add_see_also("rbd_mirror_memory_target")
7698 	    .set_description("Automatically tune the ratio of caches while respecting min values."),
7699 	
7700 	    Option("rbd_mirror_memory_target", Option::TYPE_SIZE, Option::LEVEL_BASIC)
7701 	    .set_default(4_G)
7702 	    .add_see_also("rbd_mirror_memory_autotune")
7703 	    .set_description("When tcmalloc and cache autotuning is enabled, try to keep this many bytes mapped in memory."),
7704 	
7705 	    Option("rbd_mirror_memory_base", Option::TYPE_SIZE, Option::LEVEL_DEV)
7706 	    .set_default(768_M)
7707 	    .add_see_also("rbd_mirror_memory_autotune")
7708 	    .set_description("When tcmalloc and cache autotuning is enabled, estimate the minimum amount of memory in bytes the rbd-mirror daemon will need."),
7709 	
7710 	    Option("rbd_mirror_memory_expected_fragmentation", Option::TYPE_FLOAT, Option::LEVEL_DEV)
7711 	    .set_default(0.15)
7712 	    .set_min_max(0.0, 1.0)
7713 	    .add_see_also("rbd_mirror_memory_autotune")
7714 	    .set_description("When tcmalloc and cache autotuning is enabled, estimate the percent of memory fragmentation."),
7715 	
7716 	    Option("rbd_mirror_memory_cache_min", Option::TYPE_SIZE, Option::LEVEL_DEV)
7717 	    .set_default(128_M)
7718 	    .add_see_also("rbd_mirror_memory_autotune")
7719 	    .set_description("When tcmalloc and cache autotuning is enabled, set the minimum amount of memory used for cache."),
7720 	
7721 	    Option("rbd_mirror_memory_cache_resize_interval", Option::TYPE_FLOAT, Option::LEVEL_DEV)
7722 	    .set_default(5)
7723 	    .add_see_also("rbd_mirror_memory_autotune")
7724 	    .set_description("When tcmalloc and cache autotuning is enabled, wait this many seconds between resizing caches."),
7725 	
7726 	    Option("rbd_mirror_memory_cache_autotune_interval", Option::TYPE_FLOAT, Option::LEVEL_DEV)
7727 	    .set_default(30)
7728 	    .add_see_also("rbd_mirror_memory_autotune")
7729 	    .set_description("The number of seconds to wait between rebalances when cache autotune is enabled."),
7730 	  });
7731 	}
7732 	
7733 	static std::vector<Option> get_immutable_object_cache_options() {
7734 	  return std::vector<Option>({
7735 	    Option("immutable_object_cache_path", Option::TYPE_STR, Option::LEVEL_ADVANCED)
7736 	    .set_default("/tmp")
7737 	    .set_description("immutable object cache data dir"),
7738 	
7739 	    Option("immutable_object_cache_sock", Option::TYPE_STR, Option::LEVEL_ADVANCED)
7740 	    .set_default("/var/run/ceph/immutable_object_cache_sock")
7741 	    .set_description("immutable object cache domain socket"),
7742 	
7743 	    Option("immutable_object_cache_max_size", Option::TYPE_SIZE, Option::LEVEL_ADVANCED)
7744 	    .set_default(1_G)
7745 	    .set_description("max immutable object cache data size"),
7746 	
7747 	    Option("immutable_object_cache_max_inflight_ops", Option::TYPE_UINT, Option::LEVEL_ADVANCED)
7748 	    .set_default(128)
7749 	    .set_description("max inflight promoting requests for immutable object cache daemon"),
7750 	
7751 	    Option("immutable_object_cache_client_dedicated_thread_num", Option::TYPE_UINT, Option::LEVEL_ADVANCED)
7752 	    .set_default(2)
7753 	    .set_description("immutable object cache client dedicated thread number"),
7754 	
7755 	    Option("immutable_object_cache_watermark", Option::TYPE_FLOAT, Option::LEVEL_ADVANCED)
7756 	    .set_default(0.1)
7757 	    .set_description("immutable object cache water mark"),
7758 	  });
7759 	}
7760 	
7761 	std::vector<Option> get_mds_options() {
7762 	  return std::vector<Option>({
7763 	    Option("mds_data", Option::TYPE_STR, Option::LEVEL_ADVANCED)
7764 	    .set_default("/var/lib/ceph/mds/$cluster-$id")
7765 	    .set_flag(Option::FLAG_NO_MON_UPDATE)
7766 	    .set_description("path to MDS data and keyring"),
7767 	
7768 	    Option("mds_max_xattr_pairs_size", Option::TYPE_SIZE, Option::LEVEL_ADVANCED)
7769 	    .set_default(64_K)
7770 	    .set_description("maximum aggregate size of extended attributes on a file"),
7771 	
7772 	    Option("mds_cache_trim_interval", Option::TYPE_SECS, Option::LEVEL_ADVANCED)
7773 	    .set_default(1)
7774 	    .set_description("interval in seconds between cache trimming"),
7775 	
7776 	    Option("mds_cache_size", Option::TYPE_INT, Option::LEVEL_ADVANCED)
7777 	    .set_default(0)
7778 	    .set_description("maximum number of inodes in MDS cache (<=0 is unlimited)")
7779 	    .set_long_description("This tunable is no longer recommended. Use mds_cache_memory_limit."),
7780 	
7781 	    Option("mds_cache_memory_limit", Option::TYPE_SIZE, Option::LEVEL_BASIC)
7782 	    .set_default(1*(1LL<<30))
7783 	    .set_description("target maximum memory usage of MDS cache")
7784 	    .set_long_description("This sets a target maximum memory usage of the MDS cache and is the primary tunable to limit the MDS memory usage. The MDS will try to stay under a reservation of this limit (by default 95%; 1 - mds_cache_reservation) by trimming unused metadata in its cache and recalling cached items in the client caches. It is possible for the MDS to exceed this limit due to slow recall from clients. The mds_health_cache_threshold (150%) sets a cache full threshold for when the MDS signals a cluster health warning."),
7785 	
7786 	    Option("mds_cache_reservation", Option::TYPE_FLOAT, Option::LEVEL_ADVANCED)
7787 	    .set_default(.05)
7788 	    .set_description("amount of memory to reserve for future cached objects"),
7789 	
7790 	    Option("mds_health_cache_threshold", Option::TYPE_FLOAT, Option::LEVEL_ADVANCED)
7791 	    .set_default(1.5)
7792 	    .set_description("threshold for cache size to generate health warning"),
7793 	
7794 	    Option("mds_cache_mid", Option::TYPE_FLOAT, Option::LEVEL_ADVANCED)
7795 	    .set_default(.7)
7796 	    .set_description("midpoint for MDS cache LRU"),
7797 	
7798 	    Option("mds_cache_trim_decay_rate", Option::TYPE_FLOAT, Option::LEVEL_ADVANCED)
7799 	    .set_default(1)
7800 	    .set_description("decay rate for trimming MDS cache throttle"),
7801 	
7802 	    Option("mds_cache_trim_threshold", Option::TYPE_SIZE, Option::LEVEL_ADVANCED)
7803 	    .set_default(64_K)
7804 	    .set_description("threshold for number of dentries that can be trimmed"),
7805 	
7806 	    Option("mds_max_file_recover", Option::TYPE_UINT, Option::LEVEL_ADVANCED)
7807 	    .set_default(32)
7808 	    .set_description("maximum number of files to recover file sizes in parallel"),
7809 	
7810 	    Option("mds_dir_max_commit_size", Option::TYPE_INT, Option::LEVEL_ADVANCED)
7811 	    .set_default(10)
7812 	    .set_description("maximum size in megabytes for a RADOS write to a directory"),
7813 	
7814 	    Option("mds_dir_keys_per_op", Option::TYPE_INT, Option::LEVEL_ADVANCED)
7815 	    .set_default(16384)
7816 	    .set_description("number of directory entries to read in one RADOS operation"),
7817 	
7818 	    Option("mds_decay_halflife", Option::TYPE_FLOAT, Option::LEVEL_ADVANCED)
7819 	    .set_default(5)
7820 	    .set_description("rate of decay for temperature counters on each directory for balancing"),
7821 	
7822 	    Option("mds_beacon_interval", Option::TYPE_FLOAT, Option::LEVEL_ADVANCED)
7823 	    .set_default(4)
7824 	    .set_description("interval in seconds between MDS beacons to monitors"),
7825 	
7826 	    Option("mds_beacon_grace", Option::TYPE_FLOAT, Option::LEVEL_ADVANCED)
7827 	    .set_default(15)
7828 	    .set_description("tolerance in seconds for missed MDS beacons to monitors"),
7829 	
7830 	    Option("mds_heartbeat_grace", Option::TYPE_FLOAT, Option::LEVEL_ADVANCED)
7831 	    .set_default(15)
7832 	    .set_description("tolerance in seconds for MDS internal heartbeat"),
7833 	
7834 	    Option("mds_enforce_unique_name", Option::TYPE_BOOL, Option::LEVEL_ADVANCED)
7835 	    .set_default(true)
7836 	    .set_description("require MDS name is unique in the cluster"),
7837 	
7838 	    Option("mds_session_blacklist_on_timeout", Option::TYPE_BOOL, Option::LEVEL_ADVANCED)
7839 	    .set_default(true)
7840 	    .set_description("blacklist clients whose sessions have become stale"),
7841 	
7842 	    Option("mds_session_blacklist_on_evict", Option::TYPE_BOOL, Option::LEVEL_ADVANCED)
7843 	    .set_default(true)
7844 	    .set_description("blacklist clients that have been evicted"),
7845 	
7846 	    Option("mds_sessionmap_keys_per_op", Option::TYPE_UINT, Option::LEVEL_ADVANCED)
7847 	    .set_default(1024)
7848 	    .set_description("number of omap keys to read from the SessionMap in one operation"),
7849 	
7850 	    Option("mds_recall_max_caps", Option::TYPE_SIZE, Option::LEVEL_ADVANCED)
7851 	    .set_default(5000)
7852 	    .set_description("maximum number of caps to recall from client session in single recall"),
7853 	
7854 	    Option("mds_recall_max_decay_rate", Option::TYPE_FLOAT, Option::LEVEL_ADVANCED)
7855 	    .set_default(2.5)
7856 	    .set_description("decay rate for throttle on recalled caps on a session"),
7857 	
7858 	    Option("mds_recall_max_decay_threshold", Option::TYPE_SIZE, Option::LEVEL_ADVANCED)
7859 	    .set_default(16_K)
7860 	    .set_description("decay threshold for throttle on recalled caps on a session"),
7861 	
7862 	    Option("mds_recall_global_max_decay_threshold", Option::TYPE_SIZE, Option::LEVEL_ADVANCED)
7863 	    .set_default(64_K)
7864 	    .set_description("decay threshold for throttle on recalled caps globally"),
7865 	
7866 	    Option("mds_recall_warning_threshold", Option::TYPE_SIZE, Option::LEVEL_ADVANCED)
7867 	    .set_default(32_K)
7868 	    .set_description("decay threshold for warning on slow session cap recall"),
7869 	
7870 	    Option("mds_recall_warning_decay_rate", Option::TYPE_FLOAT, Option::LEVEL_ADVANCED)
7871 	    .set_default(60.0)
7872 	    .set_description("decay rate for warning on slow session cap recall"),
7873 	
7874 	    Option("mds_session_cache_liveness_decay_rate", Option::TYPE_FLOAT, Option::LEVEL_ADVANCED)
7875 	    .add_see_also("mds_session_cache_liveness_magnitude")
7876 	    .set_default(5_min)
7877 	    .set_description("decay rate for session liveness leading to preemptive cap recall")
7878 	    .set_long_description("This determines how long a session needs to be quiescent before the MDS begins preemptively recalling capabilities. The default of 5 minutes will cause 10 halvings of the decay counter after 1 hour, or 1/1024. The default magnitude of 10 (1^10 or 1024) is chosen so that the MDS considers a previously chatty session (approximately) to be quiescent after 1 hour."),
7879 	
7880 	    Option("mds_session_cache_liveness_magnitude", Option::TYPE_SIZE, Option::LEVEL_ADVANCED)
7881 	    .add_see_also("mds_session_cache_liveness_decay_rate")
7882 	    .set_default(10)
7883 	    .set_description("decay magnitude for preemptively recalling caps on quiet client")
7884 	    .set_long_description("This is the order of magnitude difference (in base 2) of the internal liveness decay counter and the number of capabilities the session holds. When this difference occurs, the MDS treats the session as quiescent and begins recalling capabilities."),
7885 	
7886 	    Option("mds_freeze_tree_timeout", Option::TYPE_FLOAT, Option::LEVEL_DEV)
7887 	    .set_default(30)
7888 	    .set_description(""),
7889 	
7890 	    Option("mds_health_summarize_threshold", Option::TYPE_INT, Option::LEVEL_ADVANCED)
7891 	    .set_default(10)
7892 	    .set_description("threshold of number of clients to summarize late client recall"),
7893 	
7894 	    Option("mds_reconnect_timeout", Option::TYPE_FLOAT, Option::LEVEL_ADVANCED)
7895 	    .set_default(45)
7896 	    .set_description("timeout in seconds to wait for clients to reconnect during MDS reconnect recovery state"),
7897 	
7898 	    Option("mds_tick_interval", Option::TYPE_FLOAT, Option::LEVEL_ADVANCED)
7899 	    .set_default(5)
7900 	    .set_description("time in seconds between upkeep tasks"),
7901 	
7902 	    Option("mds_dirstat_min_interval", Option::TYPE_FLOAT, Option::LEVEL_DEV)
7903 	    .set_default(1)
7904 	    .set_description(""),
7905 	
7906 	    Option("mds_scatter_nudge_interval", Option::TYPE_FLOAT, Option::LEVEL_ADVANCED)
7907 	    .set_default(5)
7908 	    .set_description("minimum interval between scatter lock updates"),
7909 	
7910 	    Option("mds_client_prealloc_inos", Option::TYPE_INT, Option::LEVEL_ADVANCED)
7911 	    .set_default(1000)
7912 	    .set_description("number of unused inodes to pre-allocate to clients for file creation"),
7913 	
7914 	    Option("mds_early_reply", Option::TYPE_BOOL, Option::LEVEL_ADVANCED)
7915 	    .set_default(true)
7916 	    .set_description("additional reply to clients that metadata requests are complete but not yet durable"),
7917 	
7918 	    Option("mds_default_dir_hash", Option::TYPE_INT, Option::LEVEL_ADVANCED)
7919 	    .set_default(CEPH_STR_HASH_RJENKINS)
7920 	    .set_description("hash function to select directory fragment for dentry name"),
7921 	
7922 	    Option("mds_log_pause", Option::TYPE_BOOL, Option::LEVEL_DEV)
7923 	    .set_default(false)
7924 	    .set_description(""),
7925 	
7926 	    Option("mds_log_skip_corrupt_events", Option::TYPE_BOOL, Option::LEVEL_DEV)
7927 	    .set_default(false)
7928 	    .set_description(""),
7929 	
7930 	    Option("mds_log_max_events", Option::TYPE_INT, Option::LEVEL_ADVANCED)
7931 	    .set_default(-1)
7932 	    .set_description("maximum number of events in the MDS journal (-1 is unlimited)"),
7933 	
7934 	    Option("mds_log_events_per_segment", Option::TYPE_INT, Option::LEVEL_ADVANCED)
7935 	    .set_default(1024)
7936 	    .set_description("maximum number of events in an MDS journal segment"),
7937 	
7938 	    Option("mds_log_segment_size", Option::TYPE_SIZE, Option::LEVEL_ADVANCED)
7939 	    .set_default(0)
7940 	    .set_description("size in bytes of each MDS log segment"),
7941 	
7942 	    Option("mds_log_max_segments", Option::TYPE_UINT, Option::LEVEL_ADVANCED)
7943 	    .set_default(128)
7944 	    .set_description("maximum number of segments which may be untrimmed"),
7945 	
7946 	    Option("mds_bal_export_pin", Option::TYPE_BOOL, Option::LEVEL_ADVANCED)
7947 	    .set_default(true)
7948 	    .set_description("allow setting directory export pins to particular ranks"),
7949 	
7950 	    Option("mds_bal_sample_interval", Option::TYPE_FLOAT, Option::LEVEL_ADVANCED)
7951 	    .set_default(3.0)
7952 	    .set_description("interval in seconds between balancer ticks"),
7953 	
7954 	    Option("mds_bal_replicate_threshold", Option::TYPE_FLOAT, Option::LEVEL_ADVANCED)
7955 	    .set_default(8000)
7956 	    .set_description("hot popularity threshold to replicate a subtree"),
7957 	
7958 	    Option("mds_bal_unreplicate_threshold", Option::TYPE_FLOAT, Option::LEVEL_ADVANCED)
7959 	    .set_default(0)
7960 	    .set_description("cold popularity threshold to merge subtrees"),
7961 	
7962 	    Option("mds_bal_split_size", Option::TYPE_INT, Option::LEVEL_ADVANCED)
7963 	    .set_default(10000)
7964 	    .set_description("minimum size of directory fragment before splitting"),
7965 	
7966 	    Option("mds_bal_split_rd", Option::TYPE_FLOAT, Option::LEVEL_ADVANCED)
7967 	    .set_default(25000)
7968 	    .set_description("hot read popularity threshold for splitting a directory fragment"),
7969 	
7970 	    Option("mds_bal_split_wr", Option::TYPE_FLOAT, Option::LEVEL_ADVANCED)
7971 	    .set_default(10000)
7972 	    .set_description("hot write popularity threshold for splitting a directory fragment"),
7973 	
7974 	    Option("mds_bal_split_bits", Option::TYPE_INT, Option::LEVEL_ADVANCED)
7975 	    .set_default(3)
7976 	    .set_min_max(1, 24)
7977 	    .set_description("power of two child fragments for a fragment on split"),
7978 	
7979 	    Option("mds_bal_merge_size", Option::TYPE_INT, Option::LEVEL_ADVANCED)
7980 	    .set_default(50)
7981 	    .set_description("size of fragments where merging should occur"),
7982 	
7983 	    Option("mds_bal_interval", Option::TYPE_INT, Option::LEVEL_ADVANCED)
7984 	    .set_default(10)
7985 	    .set_description("interval between MDS balancer cycles"),
7986 	
7987 	    Option("mds_bal_fragment_interval", Option::TYPE_INT, Option::LEVEL_ADVANCED)
7988 	    .set_default(5)
7989 	    .set_description("delay in seconds before interrupting client IO to perform splits"),
7990 	
7991 	    Option("mds_bal_fragment_size_max", Option::TYPE_INT, Option::LEVEL_ADVANCED)
7992 	    .set_default(10000*10)
7993 	    .set_description("maximum size of a directory fragment before new creat/links fail"),
7994 	
7995 	    Option("mds_bal_fragment_fast_factor", Option::TYPE_FLOAT, Option::LEVEL_ADVANCED)
7996 	    .set_default(1.5)
7997 	    .set_description("ratio of mds_bal_split_size at which fast fragment splitting occurs"),
7998 	
7999 	    Option("mds_bal_fragment_dirs", Option::TYPE_BOOL, Option::LEVEL_ADVANCED)
8000 	    .set_default(true)
8001 	    .set_description("enable directory fragmentation")
8002 	    .set_long_description("Directory fragmentation is a standard feature of CephFS that allows sharding directories across multiple objects for performance and stability. Additionally, this allows fragments to be distributed across multiple active MDSs to increase throughput. Disabling (new) fragmentation should only be done in exceptional circumstances and may lead to performance issues."),
8003 	
8004 	    Option("mds_bal_idle_threshold", Option::TYPE_FLOAT, Option::LEVEL_ADVANCED)
8005 	    .set_default(0)
8006 	    .set_description("idle metadata popularity threshold before rebalancing"),
8007 	
8008 	    Option("mds_bal_max", Option::TYPE_INT, Option::LEVEL_DEV)
8009 	    .set_default(-1)
8010 	    .set_description(""),
8011 	
8012 	    Option("mds_bal_max_until", Option::TYPE_INT, Option::LEVEL_DEV)
8013 	    .set_default(-1)
8014 	    .set_description(""),
8015 	
8016 	    Option("mds_bal_mode", Option::TYPE_INT, Option::LEVEL_DEV)
8017 	    .set_default(0)
8018 	    .set_description(""),
8019 	
8020 	    Option("mds_bal_min_rebalance", Option::TYPE_FLOAT, Option::LEVEL_DEV)
8021 	    .set_default(.1)
8022 	    .set_description("amount overloaded over internal target before balancer begins offloading"),
8023 	
8024 	    Option("mds_bal_min_start", Option::TYPE_FLOAT, Option::LEVEL_DEV)
8025 	    .set_default(.2)
8026 	    .set_description(""),
8027 	
8028 	    Option("mds_bal_need_min", Option::TYPE_FLOAT, Option::LEVEL_DEV)
8029 	    .set_default(.8)
8030 	    .set_description(""),
8031 	
8032 	    Option("mds_bal_need_max", Option::TYPE_FLOAT, Option::LEVEL_DEV)
8033 	    .set_default(1.2)
8034 	    .set_description(""),
8035 	
8036 	    Option("mds_bal_midchunk", Option::TYPE_FLOAT, Option::LEVEL_DEV)
8037 	    .set_default(.3)
8038 	    .set_description(""),
8039 	
8040 	    Option("mds_bal_minchunk", Option::TYPE_FLOAT, Option::LEVEL_DEV)
8041 	    .set_default(.001)
8042 	    .set_description(""),
8043 	
8044 	    Option("mds_bal_target_decay", Option::TYPE_FLOAT, Option::LEVEL_ADVANCED)
8045 	    .set_default(10.0)
8046 	    .set_description("rate of decay for export targets communicated to clients"),
8047 	
8048 	    Option("mds_replay_interval", Option::TYPE_FLOAT, Option::LEVEL_ADVANCED)
8049 	    .set_default(1.0)
8050 	    .set_description("time in seconds between replay of updates to journal by standby replay MDS"),
8051 	
8052 	    Option("mds_shutdown_check", Option::TYPE_INT, Option::LEVEL_DEV)
8053 	    .set_default(0)
8054 	    .set_description(""),
8055 	
8056 	    Option("mds_thrash_exports", Option::TYPE_INT, Option::LEVEL_DEV)
8057 	    .set_default(0)
8058 	    .set_description(""),
8059 	
8060 	    Option("mds_thrash_fragments", Option::TYPE_INT, Option::LEVEL_DEV)
8061 	    .set_default(0)
8062 	    .set_description(""),
8063 	
8064 	    Option("mds_dump_cache_on_map", Option::TYPE_BOOL, Option::LEVEL_DEV)
8065 	    .set_default(false)
8066 	    .set_description(""),
8067 	
8068 	    Option("mds_dump_cache_after_rejoin", Option::TYPE_BOOL, Option::LEVEL_DEV)
8069 	    .set_default(false)
8070 	    .set_description(""),
8071 	
8072 	    Option("mds_verify_scatter", Option::TYPE_BOOL, Option::LEVEL_DEV)
8073 	    .set_default(false)
8074 	    .set_description(""),
8075 	
8076 	    Option("mds_debug_scatterstat", Option::TYPE_BOOL, Option::LEVEL_DEV)
8077 	    .set_default(false)
8078 	    .set_description(""),
8079 	
8080 	    Option("mds_debug_frag", Option::TYPE_BOOL, Option::LEVEL_DEV)
8081 	    .set_default(false)
8082 	    .set_description(""),
8083 	
8084 	    Option("mds_debug_auth_pins", Option::TYPE_BOOL, Option::LEVEL_DEV)
8085 	    .set_default(false)
8086 	    .set_description(""),
8087 	
8088 	    Option("mds_debug_subtrees", Option::TYPE_BOOL, Option::LEVEL_DEV)
8089 	    .set_default(false)
8090 	    .set_description(""),
8091 	
8092 	    Option("mds_kill_mdstable_at", Option::TYPE_INT, Option::LEVEL_DEV)
8093 	    .set_default(0)
8094 	    .set_description(""),
8095 	
8096 	    Option("mds_max_export_size", Option::TYPE_SIZE, Option::LEVEL_DEV)
8097 	    .set_default(20_M)
8098 	    .set_description(""),
8099 	
8100 	    Option("mds_kill_export_at", Option::TYPE_INT, Option::LEVEL_DEV)
8101 	    .set_default(0)
8102 	    .set_description(""),
8103 	
8104 	    Option("mds_kill_import_at", Option::TYPE_INT, Option::LEVEL_DEV)
8105 	    .set_default(0)
8106 	    .set_description(""),
8107 	
8108 	    Option("mds_kill_link_at", Option::TYPE_INT, Option::LEVEL_DEV)
8109 	    .set_default(0)
8110 	    .set_description(""),
8111 	
8112 	    Option("mds_kill_rename_at", Option::TYPE_INT, Option::LEVEL_DEV)
8113 	    .set_default(0)
8114 	    .set_description(""),
8115 	
8116 	    Option("mds_kill_openc_at", Option::TYPE_INT, Option::LEVEL_DEV)
8117 	    .set_default(0)
8118 	    .set_description(""),
8119 	
8120 	    Option("mds_kill_journal_at", Option::TYPE_INT, Option::LEVEL_DEV)
8121 	    .set_default(0)
8122 	    .set_description(""),
8123 	
8124 	    Option("mds_kill_journal_expire_at", Option::TYPE_INT, Option::LEVEL_DEV)
8125 	    .set_default(0)
8126 	    .set_description(""),
8127 	
8128 	    Option("mds_kill_journal_replay_at", Option::TYPE_INT, Option::LEVEL_DEV)
8129 	    .set_default(0)
8130 	    .set_description(""),
8131 	
8132 	    Option("mds_journal_format", Option::TYPE_UINT, Option::LEVEL_DEV)
8133 	    .set_default(1)
8134 	    .set_description(""),
8135 	
8136 	    Option("mds_kill_create_at", Option::TYPE_INT, Option::LEVEL_DEV)
8137 	    .set_default(0)
8138 	    .set_description(""),
8139 	
8140 	    Option("mds_inject_traceless_reply_probability", Option::TYPE_FLOAT, Option::LEVEL_DEV)
8141 	    .set_default(0)
8142 	    .set_description(""),
8143 	
8144 	    Option("mds_wipe_sessions", Option::TYPE_BOOL, Option::LEVEL_DEV)
8145 	    .set_default(0)
8146 	    .set_description(""),
8147 	
8148 	    Option("mds_wipe_ino_prealloc", Option::TYPE_BOOL, Option::LEVEL_DEV)
8149 	    .set_default(0)
8150 	    .set_description(""),
8151 	
8152 	    Option("mds_skip_ino", Option::TYPE_INT, Option::LEVEL_DEV)
8153 	    .set_default(0)
8154 	    .set_description(""),
8155 	
8156 	    Option("mds_enable_op_tracker", Option::TYPE_BOOL, Option::LEVEL_ADVANCED)
8157 	    .set_default(true)
8158 	    .set_description("track remote operation progression and statistics"),
8159 	
8160 	    Option("mds_op_history_size", Option::TYPE_UINT, Option::LEVEL_ADVANCED)
8161 	    .set_default(20)
8162 	    .set_description("maximum size for list of historical operations"),
8163 	
8164 	    Option("mds_op_history_duration", Option::TYPE_UINT, Option::LEVEL_ADVANCED)
8165 	    .set_default(600)
8166 	    .set_description("expiration time in seconds of historical operations"),
8167 	
8168 	    Option("mds_op_complaint_time", Option::TYPE_FLOAT, Option::LEVEL_ADVANCED)
8169 	    .set_default(30)
8170 	    .set_description("time in seconds to consider an operation blocked after no updates"),
8171 	
8172 	    Option("mds_op_log_threshold", Option::TYPE_INT, Option::LEVEL_DEV)
8173 	    .set_default(5)
8174 	    .set_description(""),
8175 	
8176 	    Option("mds_snap_min_uid", Option::TYPE_UINT, Option::LEVEL_ADVANCED)
8177 	    .set_default(0)
8178 	    .set_description("minimum uid of client to perform snapshots"),
8179 	
8180 	    Option("mds_snap_max_uid", Option::TYPE_UINT, Option::LEVEL_ADVANCED)
8181 	    .set_default(4294967294)
8182 	    .set_description("maximum uid of client to perform snapshots"),
8183 	
8184 	    Option("mds_snap_rstat", Option::TYPE_BOOL, Option::LEVEL_ADVANCED)
8185 	    .set_default(false)
8186 	    .set_description("enabled nested rstat for snapshots"),
8187 	
8188 	    Option("mds_verify_backtrace", Option::TYPE_UINT, Option::LEVEL_DEV)
8189 	    .set_default(1)
8190 	    .set_description(""),
8191 	
8192 	    Option("mds_max_completed_flushes", Option::TYPE_UINT, Option::LEVEL_DEV)
8193 	    .set_default(100000)
8194 	    .set_description(""),
8195 	
8196 	    Option("mds_max_completed_requests", Option::TYPE_UINT, Option::LEVEL_DEV)
8197 	    .set_default(100000)
8198 	    .set_description(""),
8199 	
8200 	    Option("mds_action_on_write_error", Option::TYPE_UINT, Option::LEVEL_ADVANCED)
8201 	    .set_default(1)
8202 	    .set_description("action to take when MDS cannot write to RADOS (0:ignore, 1:read-only, 2:suicide)"),
8203 	
8204 	    Option("mds_mon_shutdown_timeout", Option::TYPE_FLOAT, Option::LEVEL_ADVANCED)
8205 	    .set_default(5)
8206 	    .set_description("time to wait for mon to receive damaged MDS rank notification"),
8207 	
8208 	    Option("mds_max_purge_files", Option::TYPE_UINT, Option::LEVEL_ADVANCED)
8209 	    .set_default(64)
8210 	    .set_description("maximum number of deleted files to purge in parallel"),
8211 	
8212 	    Option("mds_max_purge_ops", Option::TYPE_UINT, Option::LEVEL_ADVANCED)
8213 	    .set_default(8192)
8214 	    .set_description("maximum number of purge operations performed in parallel"),
8215 	
8216 	    Option("mds_max_purge_ops_per_pg", Option::TYPE_FLOAT, Option::LEVEL_ADVANCED)
8217 	    .set_default(0.5)
8218 	    .set_description("number of parallel purge operations performed per PG"),
8219 	
8220 	    Option("mds_purge_queue_busy_flush_period", Option::TYPE_FLOAT, Option::LEVEL_DEV)
8221 	    .set_default(1.0)
8222 	    .set_description(""),
8223 	
8224 	    Option("mds_root_ino_uid", Option::TYPE_INT, Option::LEVEL_ADVANCED)
8225 	    .set_default(0)
8226 	    .set_description("default uid for new root directory"),
8227 	
8228 	    Option("mds_root_ino_gid", Option::TYPE_INT, Option::LEVEL_ADVANCED)
8229 	    .set_default(0)
8230 	    .set_description("default gid for new root directory"),
8231 	
8232 	    Option("mds_max_scrub_ops_in_progress", Option::TYPE_INT, Option::LEVEL_ADVANCED)
8233 	    .set_default(5)
8234 	    .set_description("maximum number of scrub operations performed in parallel"),
8235 	
8236 	    Option("mds_damage_table_max_entries", Option::TYPE_INT, Option::LEVEL_ADVANCED)
8237 	    .set_default(10000)
8238 	    .set_description("maximum number of damage table entries"),
8239 	
8240 	    Option("mds_client_writeable_range_max_inc_objs", Option::TYPE_UINT, Option::LEVEL_ADVANCED)
8241 	    .set_default(1024)
8242 	    .set_description("maximum number of objects in writeable range of a file for a client"),
8243 	
8244 	    Option("mds_min_caps_per_client", Option::TYPE_UINT, Option::LEVEL_ADVANCED)
8245 	    .set_default(100)
8246 	    .set_description("minimum number of capabilities a client may hold"),
8247 	
8248 	    Option("mds_max_caps_per_client", Option::TYPE_UINT, Option::LEVEL_ADVANCED)
8249 	    .set_default(1_M)
8250 	    .set_description("maximum number of capabilities a client may hold"),
8251 	
8252 	    Option("mds_hack_allow_loading_invalid_metadata", Option::TYPE_BOOL, Option::LEVEL_ADVANCED)
8253 	     .set_default(0)
8254 	     .set_description("INTENTIONALLY CAUSE DATA LOSS by bypasing checks for invalid metadata on disk. Allows testing repair tools."),
8255 	
8256 	    Option("mds_defer_session_stale", Option::TYPE_BOOL, Option::LEVEL_DEV)
8257 	     .set_default(true),
8258 	
8259 	    Option("mds_inject_migrator_session_race", Option::TYPE_BOOL, Option::LEVEL_DEV)
8260 	     .set_default(false),
8261 	
8262 	    Option("mds_request_load_average_decay_rate", Option::TYPE_FLOAT, Option::LEVEL_ADVANCED)
8263 	    .set_default(60)
8264 	    .set_description("rate of decay in seconds for calculating request load average"),
8265 	
8266 	    Option("mds_cap_revoke_eviction_timeout", Option::TYPE_FLOAT, Option::LEVEL_ADVANCED)
8267 	     .set_default(0)
8268 	     .set_description("number of seconds after which clients which have not responded to cap revoke messages by the MDS are evicted."),
8269 	
8270 	    Option("mds_max_retries_on_remount_failure", Option::TYPE_UINT, Option::LEVEL_ADVANCED)
8271 	     .set_default(5)
8272 	     .set_description("number of consecutive failed remount attempts for invalidating kernel dcache after which client would abort."),
8273 	
8274 	    Option("mds_dump_cache_threshold_formatter", Option::TYPE_SIZE, Option::LEVEL_DEV)
8275 	     .set_default(1_G)
8276 	     .set_description("threshold for cache usage to disallow \"dump cache\" operation to formatter")
8277 	     .set_long_description("Disallow MDS from dumping caches to formatter via \"dump cache\" command if cache usage exceeds this threshold."),
8278 	
8279 	    Option("mds_dump_cache_threshold_file", Option::TYPE_SIZE, Option::LEVEL_DEV)
8280 	     .set_default(0)
8281 	     .set_description("threshold for cache usage to disallow \"dump cache\" operation to file")
8282 	     .set_long_description("Disallow MDS from dumping caches to file via \"dump cache\" command if cache usage exceeds this threshold."),
8283 	
8284 	    Option("mds_task_status_update_interval", Option::TYPE_FLOAT, Option::LEVEL_DEV)
8285 	     .set_default(2.0)
8286 	     .set_description("task status update interval to manager")
8287 	     .set_long_description("interval (in seconds) for sending mds task status to ceph manager"),
8288 	  });
8289 	}
8290 	
8291 	std::vector<Option> get_mds_client_options() {
8292 	  return std::vector<Option>({
8293 	    Option("client_cache_size", Option::TYPE_SIZE, Option::LEVEL_BASIC)
8294 	    .set_default(16384)
8295 	    .set_description("soft maximum number of directory entries in client cache"),
8296 	
8297 	    Option("client_cache_mid", Option::TYPE_FLOAT, Option::LEVEL_ADVANCED)
8298 	    .set_default(.75)
8299 	    .set_description("mid-point of client cache LRU"),
8300 	
8301 	    Option("client_use_random_mds", Option::TYPE_BOOL, Option::LEVEL_DEV)
8302 	    .set_default(false)
8303 	    .set_description("issue new requests to a random active MDS"),
8304 	
8305 	    Option("client_mount_timeout", Option::TYPE_FLOAT, Option::LEVEL_ADVANCED)
8306 	    .set_default(300.0)
8307 	    .set_description("timeout for mounting CephFS (seconds)"),
8308 	
8309 	    Option("client_tick_interval", Option::TYPE_FLOAT, Option::LEVEL_DEV)
8310 	    .set_default(1.0)
8311 	    .set_description("seconds between client upkeep ticks"),
8312 	
8313 	    Option("client_trace", Option::TYPE_STR, Option::LEVEL_DEV)
8314 	    .set_default("")
8315 	    .set_description("file containing trace of client operations"),
8316 	
8317 	    Option("client_readahead_min", Option::TYPE_SIZE, Option::LEVEL_ADVANCED)
8318 	    .set_default(128*1024)
8319 	    .set_description("minimum bytes to readahead in a file"),
8320 	
8321 	    Option("client_readahead_max_bytes", Option::TYPE_SIZE, Option::LEVEL_ADVANCED)
8322 	    .set_default(0)
8323 	    .set_description("maximum bytes to readahead in a file (zero is unlimited)"),
8324 	
8325 	    Option("client_readahead_max_periods", Option::TYPE_INT, Option::LEVEL_ADVANCED)
8326 	    .set_default(4)
8327 	    .set_description("maximum stripe periods to readahead in a file"),
8328 	
8329 	    Option("client_reconnect_stale", Option::TYPE_BOOL, Option::LEVEL_ADVANCED)
8330 	    .set_default(false)
8331 	    .set_description("reconnect when the session becomes stale"),
8332 	
8333 	    Option("client_snapdir", Option::TYPE_STR, Option::LEVEL_ADVANCED)
8334 	    .set_default(".snap")
8335 	    .set_description("pseudo directory for snapshot access to a directory"),
8336 	
8337 	    Option("client_mountpoint", Option::TYPE_STR, Option::LEVEL_ADVANCED)
8338 	    .set_default("/")
8339 	    .set_description("default mount-point"),
8340 	
8341 	    Option("client_mount_uid", Option::TYPE_INT, Option::LEVEL_ADVANCED)
8342 	    .set_default(-1)
8343 	    .set_description("uid to mount as"),
8344 	
8345 	    Option("client_mount_gid", Option::TYPE_INT, Option::LEVEL_ADVANCED)
8346 	    .set_default(-1)
8347 	    .set_description("gid to mount as"),
8348 	
8349 	    /* RADOS client option */
8350 	    Option("client_notify_timeout", Option::TYPE_INT, Option::LEVEL_DEV)
8351 	    .set_default(10)
8352 	    .set_description(""),
8353 	
8354 	    /* RADOS client option */
8355 	    Option("osd_client_watch_timeout", Option::TYPE_INT, Option::LEVEL_DEV)
8356 	    .set_default(30)
8357 	    .set_description(""),
8358 	
8359 	    Option("client_caps_release_delay", Option::TYPE_INT, Option::LEVEL_DEV)
8360 	    .set_default(5)
8361 	    .set_description(""),
8362 	
8363 	    Option("client_quota_df", Option::TYPE_BOOL, Option::LEVEL_ADVANCED)
8364 	    .set_default(true)
8365 	    .set_description("show quota usage for statfs (df)"),
8366 	
8367 	    Option("client_oc", Option::TYPE_BOOL, Option::LEVEL_ADVANCED)
8368 	    .set_default(true)
8369 	    .set_description("enable object caching"),
8370 	
8371 	    Option("client_oc_size", Option::TYPE_SIZE, Option::LEVEL_ADVANCED)
8372 	    .set_default(200_M)
8373 	    .set_description("maximum size of object cache"),
8374 	
8375 	    Option("client_oc_max_dirty", Option::TYPE_SIZE, Option::LEVEL_ADVANCED)
8376 	    .set_default(100_M)
8377 	    .set_description("maximum size of dirty pages in object cache"),
8378 	
8379 	    Option("client_oc_target_dirty", Option::TYPE_SIZE, Option::LEVEL_ADVANCED)
8380 	    .set_default(8_M)
8381 	    .set_description("target size of dirty pages object cache"),
8382 	
8383 	    Option("client_oc_max_dirty_age", Option::TYPE_FLOAT, Option::LEVEL_ADVANCED)
8384 	    .set_default(5.0)
8385 	    .set_description("maximum age of dirty pages in object cache (seconds)"),
8386 	
8387 	    Option("client_oc_max_objects", Option::TYPE_INT, Option::LEVEL_ADVANCED)
8388 	    .set_default(1000)
8389 	    .set_description("maximum number of objects in cache"),
8390 	
8391 	    Option("client_debug_getattr_caps", Option::TYPE_BOOL, Option::LEVEL_DEV)
8392 	    .set_default(false)
8393 	    .set_description(""),
8394 	
8395 	    Option("client_debug_force_sync_read", Option::TYPE_BOOL, Option::LEVEL_DEV)
8396 	    .set_default(false)
8397 	    .set_description(""),
8398 	
8399 	    Option("client_debug_inject_tick_delay", Option::TYPE_INT, Option::LEVEL_DEV)
8400 	    .set_default(0)
8401 	    .set_description(""),
8402 	
8403 	    Option("client_max_inline_size", Option::TYPE_SIZE, Option::LEVEL_DEV)
8404 	    .set_default(4_K)
8405 	    .set_description(""),
8406 	
8407 	    Option("client_inject_release_failure", Option::TYPE_BOOL, Option::LEVEL_DEV)
8408 	    .set_default(false)
8409 	    .set_description(""),
8410 	
8411 	    Option("client_inject_fixed_oldest_tid", Option::TYPE_BOOL, Option::LEVEL_DEV)
8412 	    .set_default(false)
8413 	    .set_description(""),
8414 	
8415 	    Option("client_metadata", Option::TYPE_STR, Option::LEVEL_ADVANCED)
8416 	    .set_default("")
8417 	    .set_description("metadata key=value comma-delimited pairs appended to session metadata"),
8418 	
8419 	    Option("client_acl_type", Option::TYPE_STR, Option::LEVEL_ADVANCED)
8420 	    .set_default("")
8421 	    .set_description("ACL type to enforce (none or \"posix_acl\")"),
8422 	
8423 	    Option("client_permissions", Option::TYPE_BOOL, Option::LEVEL_ADVANCED)
8424 	    .set_default(true)
8425 	    .set_description("client-enforced permission checking"),
8426 	
8427 	    Option("client_dirsize_rbytes", Option::TYPE_BOOL, Option::LEVEL_ADVANCED)
8428 	    .set_default(true)
8429 	    .set_description("set the directory size as the number of file bytes recursively used")
8430 	    .set_long_description("This option enables a CephFS feature that stores the recursive directory size (the bytes used by files in the directory and its descendents) in the st_size field of the stat structure."),
8431 	
8432 	    Option("client_force_lazyio", Option::TYPE_BOOL, Option::LEVEL_ADVANCED)
8433 	    .set_default(false)
8434 	    .set_description(""),
8435 	
8436 	    // note: the max amount of "in flight" dirty data is roughly (max - target)
8437 	    Option("fuse_use_invalidate_cb", Option::TYPE_BOOL, Option::LEVEL_ADVANCED)
8438 	    .set_default(true)
8439 	    .set_description("use fuse 2.8+ invalidate callback to keep page cache consistent"),
8440 	
8441 	    Option("fuse_disable_pagecache", Option::TYPE_BOOL, Option::LEVEL_ADVANCED)
8442 	    .set_default(false)
8443 	    .set_description("disable page caching in the kernel for this FUSE mount"),
8444 	
8445 	    Option("fuse_allow_other", Option::TYPE_BOOL, Option::LEVEL_ADVANCED)
8446 	    .set_default(true)
8447 	    .set_description("pass allow_other to FUSE on mount"),
8448 	
8449 	    Option("fuse_default_permissions", Option::TYPE_BOOL, Option::LEVEL_ADVANCED)
8450 	    .set_default(false)
8451 	    .set_description("pass default_permisions to FUSE on mount"),
8452 	
8453 	    Option("fuse_big_writes", Option::TYPE_BOOL, Option::LEVEL_ADVANCED)
8454 	    .set_default(false)
8455 	    .set_description("big_writes is deprecated in libfuse 3.0.0"),
8456 	
8457 	    Option("fuse_max_write", Option::TYPE_SIZE, Option::LEVEL_ADVANCED)
8458 	    .set_default(0)
8459 	    .set_description("set the maximum number of bytes in a single write operation")
8460 	    .set_long_description("Set the maximum number of bytes in a single write operation that may pass atomically through FUSE. The FUSE default is 128kB and may be indicated by setting this option to 0."),
8461 	
8462 	    Option("fuse_atomic_o_trunc", Option::TYPE_BOOL, Option::LEVEL_ADVANCED)
8463 	    .set_default(true)
8464 	    .set_description("pass atomic_o_trunc flag to FUSE on mount"),
8465 	
8466 	    Option("fuse_debug", Option::TYPE_BOOL, Option::LEVEL_DEV)
8467 	    .set_default(false)
8468 	    .set_description(""),
8469 	
8470 	    Option("fuse_multithreaded", Option::TYPE_BOOL, Option::LEVEL_ADVANCED)
8471 	    .set_default(true)
8472 	    .set_description("allow parallel processing through FUSE library"),
8473 	
8474 	    Option("fuse_require_active_mds", Option::TYPE_BOOL, Option::LEVEL_ADVANCED)
8475 	    .set_default(true)
8476 	    .set_description("require active MDSs in the file system when mounting"),
8477 	
8478 	    Option("fuse_syncfs_on_mksnap", Option::TYPE_BOOL, Option::LEVEL_ADVANCED)
8479 	    .set_default(true)
8480 	    .set_description("synchronize all local metadata/file changes after snapshot"),
8481 	
8482 	    Option("fuse_set_user_groups", Option::TYPE_BOOL, Option::LEVEL_ADVANCED)
8483 	    .set_default(true)
8484 	    .set_description("check for ceph-fuse to consider supplementary groups for permissions"),
8485 	
8486 	    Option("client_try_dentry_invalidate", Option::TYPE_BOOL, Option::LEVEL_DEV)
8487 	    .set_default(false)
8488 	    .set_description(""),
8489 	
8490 	    Option("client_die_on_failed_remount", Option::TYPE_BOOL, Option::LEVEL_DEV)
8491 	    .set_default(false)
8492 	    .set_description(""),
8493 	
8494 	    Option("client_die_on_failed_dentry_invalidate", Option::TYPE_BOOL, Option::LEVEL_ADVANCED)
8495 	    .set_default(true)
8496 	    .set_description("kill the client when no dentry invalidation options are available")
8497 	    .set_long_description("The CephFS client requires a mechanism to invalidate dentries in the caller (e.g. the kernel for ceph-fuse) when capabilities must be recalled. If the client cannot do this then the MDS cache cannot shrink which can cause the MDS to fail."),
8498 	
8499 	    Option("client_check_pool_perm", Option::TYPE_BOOL, Option::LEVEL_ADVANCED)
8500 	    .set_default(true)
8501 	    .set_description("confirm access to inode's data pool/namespace described in file layout"),
8502 	
8503 	    Option("client_use_faked_inos", Option::TYPE_BOOL, Option::LEVEL_DEV)
8504 	    .set_default(false)
8505 	    .set_description(""),
8506 	
8507 	    Option("client_mds_namespace", Option::TYPE_STR, Option::LEVEL_ADVANCED)
8508 	    .set_default("")
8509 	
8510 	    .set_description("CephFS file system name to mount")
8511 	    .set_long_description("Use this with ceph-fuse, or with any process "
8512 	        "that uses libcephfs.  Programs using libcephfs may also pass "
8513 	        "the filesystem name into mount(), which will override this setting. "
8514 	        "If no filesystem name is given in mount() or this setting, the default "
8515 	        "filesystem will be mounted (usually the first created)."),
8516 	
8517 	    Option("fake_statfs_for_testing", Option::TYPE_INT, Option::LEVEL_DEV)
8518 	    .set_default(0)
8519 	    .set_description("Set a value for kb and compute kb_used from total of num_bytes"),
8520 	
8521 	    Option("debug_allow_any_pool_priority", Option::TYPE_BOOL, Option::LEVEL_DEV)
8522 	    .set_default(false)
8523 	    .set_description("Allow any pool priority to be set to test conversion to new range"),
8524 	  });
8525 	}
8526 	
8527 	
8528 	static std::vector<Option> build_options()
8529 	{
8530 	  std::vector<Option> result = get_global_options();
8531 	
8532 	  auto ingest = [&result](std::vector<Option>&& options, const char* svc) {
8533 	    for (auto &o : options) {
8534 	      o.add_service(svc);
8535 	      result.push_back(std::move(o));
8536 	    }
8537 	  };
8538 	
8539 	  ingest(get_rgw_options(), "rgw");
8540 	  ingest(get_rbd_options(), "rbd");
8541 	  ingest(get_rbd_mirror_options(), "rbd-mirror");
8542 	  ingest(get_immutable_object_cache_options(), "immutable-objet-cache");
8543 	  ingest(get_mds_options(), "mds");
8544 	  ingest(get_mds_client_options(), "mds_client");
8545 	
8546 	  return result;
8547 	}
8548 	
8549 	const std::vector<Option> ceph_options = build_options();
8550