void LogChannel::do_log(clog_type prio, const std::string& s)
{
Mutex::Locker l(channel_lock);
- int lvl = (prio == CLOG_ERROR ? -1 : 0);
- ldout(cct,lvl) << "log " << prio << " : " << s << dendl;
+ if (CLOG_ERROR == prio) {
+ ldout(cct,-1) << "log " << prio << " : " << s << dendl;
+ } else {
+ ldout(cct,0) << "log " << prio << " : " << s << dendl;
+ }
LogEntry e;
e.stamp = ceph_clock_now();
// seq and who should be set for syslog/graylog/log_to_mon
#define dout_impl(cct, sub, v) \
do { \
const bool should_gather = [&](const auto cctX) { \
- if constexpr (ceph::dout::is_dynamic<decltype(sub)>::value) { \
+ if constexpr (ceph::dout::is_dynamic<decltype(sub)>::value || \
+ ceph::dout::is_dynamic<decltype(v)>::value) { \
return cctX->_conf->subsys.should_gather(sub, v); \
} else { \
- return cctX->_conf->subsys.template should_gather<sub>(v); \
+ /* The parentheses are **essential** because commas in angle \
+ * brackets are NOT ignored on macro expansion! A language's \
+ * limitation, sorry. */ \
+ return (cctX->_conf->subsys.template should_gather<sub, v>()); \
} \
}(cct); \
\
void Logv(const rocksdb::InfoLogLevel log_level, const char* format,
va_list ap) override {
int v = rocksdb::NUM_INFO_LOG_LEVELS - log_level - 1;
- dout(v);
+ dout(ceph::dout::need_dynamic(v));
char buf[65536];
vsnprintf(buf, sizeof(buf), format, ap);
*_dout << buf << dendl;
return ceph_subsys_get_as_array()[subsys].name;
}
- template <unsigned SubV>
- bool should_gather(int level) {
+ template <unsigned SubV, int LvlV>
+ bool should_gather() {
static_assert(SubV < get_num(), "wrong subsystem ID");
- return level <= m_gather_levels[SubV];
+ static_assert(LvlV >= -1 && LvlV <= 200);
+ return LvlV <= m_gather_levels[SubV];
}
bool should_gather(const unsigned sub, int level) {
assert(sub < m_subsys.size());
return; // i won't print anything.
if (subtrees.empty()) {
- dout(dbl) << "show_subtrees - no subtrees" << dendl;
+ dout(ceph::dout::need_dynamic(dbl)) << "show_subtrees - no subtrees"
+ << dendl;
return;
}
snprintf(s, sizeof(s), "%2d,%2d", int(dir->get_dir_auth().first), int(dir->get_dir_auth().second));
// print
- dout(dbl) << indent << "|_" << pad << s << " " << auth << *dir << dendl;
+ dout(ceph::dout::need_dynamic(dbl)) << indent << "|_" << pad << s
+ << " " << auth << *dir << dendl;
if (dir->ino() == MDS_INO_ROOT)
assert(dir->inode == root);
{
int level = luaL_checkinteger(L, 1);
lua_concat(L, lua_gettop(L)-1);
- mantle_dout(level) << lua_tostring(L, 2) << mantle_dendl;
+ mantle_dout(ceph::dout::need_dynamic(level)) << lua_tostring(L, 2)
+ << mantle_dendl;
return 0;
}
{
#undef dout_prefix
#define dout_prefix *_dout << "mgr[" << get_name() << "] "
- dout(level) << record << dendl;
+ dout(ceph::dout::need_dynamic(level)) << record << dendl;
#undef dout_prefix
#define dout_prefix *_dout << "mgr " << __func__ << " "
}
// my methods
-void MDSMonitor::print_map(FSMap &m, int dbl)
+template <int dblV = 7>
+void MDSMonitor::print_map(FSMap &m)
{
- dout(dbl) << "print_map\n";
+ dout(dblV) << "print_map\n";
m.print(*_dout);
*_dout << dendl;
}
// new map
dout(4) << "new map" << dendl;
- print_map(fsmap, 0);
+ print_map<0>(fsmap);
if (!g_conf->mon_mds_skip_sanity) {
fsmap.sanity();
}
// print map iff 'debug mon = 30' or higher
- print_map(pending_fsmap, 30);
+ print_map<30>(pending_fsmap);
if (!g_conf->mon_mds_skip_sanity) {
pending_fsmap.sanity();
}
FSMap pending_fsmap; // current + pending updates
// my helpers
- void print_map(FSMap &m, int dbl=7);
+ template<int dblV = 7>
+ void print_map(FSMap &m);
void _updated(MonOpRequestRef op);
lderr(cct) << "failed to decode message of type " << type
<< " v" << header.version
<< ": " << e.what() << dendl;
- ldout(cct, cct->_conf->ms_dump_corrupt_message_level) << "dump: \n";
+ ldout(cct, ceph::dout::need_dynamic(
+ cct->_conf->ms_dump_corrupt_message_level)) << "dump: \n";
m->get_payload().hexdump(*_dout);
*_dout << dendl;
if (cct->_conf->ms_die_on_bad_msg)
va_end(ap);
#define MAX_SIZE 8196
if ((n > -1 && n < size) || size > MAX_SIZE) {
- ldout(ch->cct, level) << buf << dendl;
+ ldout(ch->cct, ceph::dout::need_dynamic(level)) << buf << dendl;
return n;
}
size *= 2;
return false;
}
-void BlueStore::OnodeSpace::dump(CephContext *cct, int lvl)
+template <int LogLevelV = 30>
+void BlueStore::OnodeSpace::dump(CephContext *cct)
{
for (auto& i : onode_map) {
- ldout(cct, lvl) << i.first << " : " << i.second << dendl;
+ ldout(cct, LogLevelV) << i.first << " : " << i.second << dendl;
}
}
#undef dout_prefix
#define dout_prefix *_dout << "bluestore.sharedblobset(" << this << ") "
-void BlueStore::SharedBlobSet::dump(CephContext *cct, int lvl)
+template <int LogLevelV = 30>
+void BlueStore::SharedBlobSet::dump(CephContext *cct)
{
std::lock_guard<std::mutex> l(lock);
for (auto& i : sb_map) {
- ldout(cct, lvl) << i.first << " : " << *i.second << dendl;
+ ldout(cct, LogLevelV) << i.first << " : " << *i.second << dendl;
}
}
++num_objects;
num_spanning_blobs += o->extent_map.spanning_blob_map.size();
o->extent_map.fault_range(db, 0, OBJECT_MAX_SIZE);
- _dump_onode(o, 30);
+ _dump_onode(o);
// shards
if (!o->extent_map.shards.empty()) {
++num_sharded_objects;
if (misref_extents.intersects(e.offset, e.length)) {
if (first_dump) {
first_dump = false;
- _dump_onode(o, 10);
+ _dump_onode<10>(o);
}
broken_blob = true;
break;
derr << __func__ << " error " << cpp_strerror(r)
<< " not handled on operation " << op->op
<< " (op " << pos << ", counting from 0)" << dendl;
- _dump_transaction(t, 0);
+ _dump_transaction<0>(t);
assert(0 == "unexpected error");
}
<< " (op " << pos << ", counting from 0)"
<< dendl;
derr << msg << dendl;
- _dump_transaction(t, 0);
+ _dump_transaction<0>(t);
assert(0 == "unexpected error");
}
}
return r;
}
-void BlueStore::_dump_onode(const OnodeRef& o, int log_level)
+template <int LogLevelV = 30>
+void BlueStore::_dump_onode(const OnodeRef& o)
{
- if (!cct->_conf->subsys.should_gather(ceph_subsys_bluestore, log_level))
+ if (!cct->_conf->subsys.should_gather<ceph_subsys_bluestore, LogLevelV>())
return;
- dout(log_level) << __func__ << " " << o << " " << o->oid
+ dout(LogLevelV) << __func__ << " " << o << " " << o->oid
<< " nid " << o->onode.nid
<< " size 0x" << std::hex << o->onode.size
<< " (" << std::dec << o->onode.size << ")"
for (auto p = o->onode.attrs.begin();
p != o->onode.attrs.end();
++p) {
- dout(log_level) << __func__ << " attr " << p->first
+ dout(LogLevelV) << __func__ << " attr " << p->first
<< " len " << p->second.length() << dendl;
}
- _dump_extent_map(o->extent_map, log_level);
+ _dump_extent_map<LogLevelV>(o->extent_map);
}
-void BlueStore::_dump_extent_map(ExtentMap &em, int log_level)
+template <int LogLevelV = 30>
+void BlueStore::_dump_extent_map(ExtentMap &em)
{
uint64_t pos = 0;
for (auto& s : em.shards) {
- dout(log_level) << __func__ << " shard " << *s.shard_info
+ dout(LogLevelV) << __func__ << " shard " << *s.shard_info
<< (s.loaded ? " (loaded)" : "")
<< (s.dirty ? " (dirty)" : "")
<< dendl;
}
for (auto& e : em.extent_map) {
- dout(log_level) << __func__ << " " << e << dendl;
+ dout(LogLevelV) << __func__ << " " << e << dendl;
assert(e.logical_offset >= pos);
pos = e.logical_offset + e.length;
const bluestore_blob_t& blob = e.blob->get_blob();
unsigned n = blob.get_csum_count();
for (unsigned i = 0; i < n; ++i)
v.push_back(blob.get_csum_item(i));
- dout(log_level) << __func__ << " csum: " << std::hex << v << std::dec
+ dout(LogLevelV) << __func__ << " csum: " << std::hex << v << std::dec
<< dendl;
}
std::lock_guard<std::recursive_mutex> l(e.blob->shared_blob->get_cache()->lock);
for (auto& i : e.blob->shared_blob->bc.buffer_map) {
- dout(log_level) << __func__ << " 0x" << std::hex << i.first
+ dout(LogLevelV) << __func__ << " 0x" << std::hex << i.first
<< "~" << i.second->length << std::dec
<< " " << *i.second << dendl;
}
}
}
-void BlueStore::_dump_transaction(Transaction *t, int log_level)
+template <int LogLevelV = 30>
+void BlueStore::_dump_transaction(Transaction *t)
{
- dout(log_level) << __func__ << " transaction dump:\n";
+ dout(LogLevelV) << __func__ << " transaction dump:\n";
JSONFormatter f(true);
f.open_object_section("transaction");
t->dump(&f);
dout(15) << __func__ << " " << c->cid << " " << o->oid
<< " 0x" << std::hex << offset << std::dec << dendl;
- _dump_onode(o, 30);
+ _dump_onode(o);
if (offset == o->onode.size)
return;
for (auto& p : coll_map) {
if (!p.second->onode_map.empty()) {
derr << __func__ << "stray onodes on " << p.first << dendl;
- p.second->onode_map.dump(cct, 0);
+ p.second->onode_map.dump<0>(cct);
}
if (!p.second->shared_blob_set.empty()) {
derr << __func__ << " stray shared blobs on " << p.first << dendl;
- p.second->shared_blob_set.dump(cct, 0);
+ p.second->shared_blob_set.dump<0>(cct);
}
assert(p.second->onode_map.empty());
assert(p.second->shared_blob_set.empty());
return sb_map.empty();
}
- void dump(CephContext *cct, int lvl);
+ template <int LogLevelV>
+ void dump(CephContext *cct);
};
//#define CACHE_BLOB_BL // not sure if this is a win yet or not... :/
void clear();
bool empty();
- void dump(CephContext *cct, int lvl);
+ template <int LogLevelV>
+ void dump(CephContext *cct);
/// return true if f true for any item
bool map_any(std::function<bool(OnodeRef)> f);
void _assign_nid(TransContext *txc, OnodeRef o);
uint64_t _assign_blobid(TransContext *txc);
- void _dump_onode(const OnodeRef& o, int log_level=30);
- void _dump_extent_map(ExtentMap& em, int log_level=30);
- void _dump_transaction(Transaction *t, int log_level = 30);
+ template <int LogLevelV = 30> void _dump_onode(const OnodeRef& o);
+ template <int LogLevelV = 30> void _dump_extent_map(ExtentMap& em);
+ template <int LogLevelV = 30> void _dump_transaction(Transaction *t);
TransContext *_txc_create(Collection *c, OpSequencer *osr);
void _txc_update_store_statfs(TransContext *txc);
history.push_back(status);
/* dump output on either rgw_sync, or rgw -- but only once */
if (cct->_conf->subsys.should_gather(ceph_subsys_rgw_sync, level)) {
- lsubdout(cct, rgw_sync, level) << "RGW-SYNC:" << to_str() << dendl;
+ lsubdout(cct, rgw_sync,
+ ceph::dout::need_dynamic(level)) << "RGW-SYNC:" << to_str() << dendl;
} else {
- lsubdout(cct, rgw, level) << "RGW-SYNC:" << to_str() << dendl;
+ lsubdout(cct, rgw,
+ ceph::dout::need_dynamic(level)) << "RGW-SYNC:" << to_str() << dendl;
}
}
int n = vsnprintf(buf, size, format, ap);
va_end(ap);
if ((n > -1 && n < size) || size > 8196) {
- dout(level) << buf << dendl;
+ dout(ceph::dout::need_dynamic(level)) << buf << dendl;
return n;
}
size *= 2;