virtual ~DoutPrefixProvider() {}
};
+// helpers
+namespace ceph::dout {
+
+template<typename T>
+struct dynamic_marker_t {
+ T value;
+ operator T() const { return value; }
+};
+
+template<typename T>
+dynamic_marker_t<T> need_dynamic(T&& t) {
+ return dynamic_marker_t<T>{ std::forward<T>(t) };
+}
+
+template<typename T>
+struct is_dynamic : public std::false_type {};
+
+template<typename T>
+struct is_dynamic<dynamic_marker_t<T>> : public std::true_type {};
+
+} // ceph::dout
+
// generic macros
#define dout_prefix *_dout
#define dout_impl(cct, sub, v) \
do { \
- if (cct->_conf->subsys.should_gather(sub, v)) { \
+ const bool should_gather = [&](const auto cctX) { \
+ if constexpr (ceph::dout::is_dynamic<decltype(sub)>::value) { \
+ return cctX->_conf->subsys.should_gather(sub, v); \
+ } else { \
+ return cctX->_conf->subsys.template should_gather<sub>(v); \
+ } \
+ }(cct); \
+ \
+ if (should_gather) { \
static size_t _log_exp_length = 80; \
- ceph::logging::Entry *_dout_e = cct->_log->create_entry(v, sub, &_log_exp_length); \
+ ceph::logging::Entry *_dout_e = \
+ cct->_log->create_entry(v, sub, &_log_exp_length); \
static_assert(std::is_convertible<decltype(&*cct), \
CephContext* >::value, \
"provided cct must be compatible with CephContext*"); \
#define ldout(cct, v) dout_impl(cct, dout_subsys, v) dout_prefix
#define lderr(cct) dout_impl(cct, ceph_subsys_, -1) dout_prefix
-#define ldpp_dout(dpp, v) if (dpp) dout_impl(dpp->get_cct(), dpp->get_subsys(), v) (*_dout << dpp->gen_prefix())
+#define ldpp_dout(dpp, v) \
+ if (dpp) \
+ dout_impl(dpp->get_cct(), ceph::dout::need_dynamic(dpp->get_subsys()), v) \
+ (*_dout << dpp->gen_prefix())
#define lgeneric_subdout(cct, sub, v) dout_impl(cct, ceph_subsys_##sub, v) *_dout
#define lgeneric_dout(cct, v) dout_impl(cct, ceph_subsys_, v) *_dout
#include <string>
#include <vector>
+#include "common/subsys_types.h"
+
#include "include/assert.h"
namespace ceph {
return m_subsys[subsys].name;
}
- bool should_gather(unsigned sub, int level) {
+ template <unsigned SubV>
+ bool should_gather(int level) {
+ static_assert(SubV < ceph_subsys_get_num(), "wrong subsystem ID");
+ return level <= m_subsys[SubV].gather_level ||
+ level <= m_subsys[SubV].log_level;
+ }
+ bool should_gather(const unsigned sub, int level) {
assert(sub < m_subsys.size());
return level <= m_subsys[sub].gather_level ||
level <= m_subsys[sub].log_level;
if ((dout_context)->_conf->subsys.should_gather(ceph_subsys_mds_balancer, lvl)) {\
subsys = ceph_subsys_mds_balancer;\
}\
- dout_impl(dout_context, subsys, lvl) dout_prefix
+ dout_impl(dout_context, ceph::dout::need_dynamic(subsys), lvl) dout_prefix
#define mantle_dendl dendl; } while (0)