#include "../include/unordered_map.h"
#define dout_subsys ceph_subsys_osd
+#undef dout_prefix
+#define dout_prefix _prefix(_dout, this)
+
+static ostream& _prefix(std::ostream *_dout, const PGLog *pglog)
+{
+ return *_dout << pglog->gen_prefix();
+}
//////////////////// PGLog::IndexedLog ////////////////////
olog.can_rollback_to,
omissing,
0,
- 0);
+ 0,
+ this);
if (lu < oinfo.last_update) {
dout(10) << " peer osd." << from << " last_update now " << lu << dendl;
eversion_t olog_can_rollback_to,
pg_missing_t &missing,
boost::optional<pair<eversion_t, hobject_t> > *new_divergent_prior,
- LogEntryHandler *rollbacker
+ LogEntryHandler *rollbacker,
+ const DoutPrefixProvider *dpp
)
{
- dout(10) << __func__ << ": merging hoid " << hoid
- << " entries: " << entries << dendl;
+ ldpp_dout(dpp, 20) << __func__ << ": merging hoid " << hoid
+ << " entries: " << entries << dendl;
if (cmp(hoid, info.last_backfill, info.last_backfill_bitwise) > 0) {
- dout(10) << __func__ << ": hoid " << hoid << " after last_backfill"
- << dendl;
+ ldpp_dout(dpp, 10) << __func__ << ": hoid " << hoid << " after last_backfill"
+ << dendl;
return;
}
const bool object_not_in_store =
!missing.is_missing(hoid) &&
entries.rbegin()->is_delete();
- dout(10) << __func__ << ": hoid " << hoid
- << " prior_version: " << prior_version
- << " first_divergent_update: " << first_divergent_update
- << " last_divergent_update: " << last_divergent_update
- << dendl;
+ ldpp_dout(dpp, 10) << __func__ << ": hoid " << hoid
+ << " prior_version: " << prior_version
+ << " first_divergent_update: " << first_divergent_update
+ << " last_divergent_update: " << last_divergent_update
+ << dendl;
ceph::unordered_map<hobject_t, pg_log_entry_t*>::const_iterator objiter =
log.objects.find(hoid);
/// Case 1)
assert(objiter->second->version > last_divergent_update);
- dout(10) << __func__ << ": more recent entry found: "
- << *objiter->second << ", already merged" << dendl;
+ ldpp_dout(dpp, 10) << __func__ << ": more recent entry found: "
+ << *objiter->second << ", already merged" << dendl;
// ensure missing has been updated appropriately
if (objiter->second->is_update()) {
return;
}
- dout(10) << __func__ << ": hoid " << hoid
- <<" has no more recent entries in log" << dendl;
+ ldpp_dout(dpp, 10) << __func__ << ": hoid " << hoid
+ <<" has no more recent entries in log" << dendl;
if (prior_version == eversion_t() || entries.front().is_clone()) {
/// Case 2)
- dout(10) << __func__ << ": hoid " << hoid
- << " prior_version or op type indicates creation, deleting"
- << dendl;
+ ldpp_dout(dpp, 10) << __func__ << ": hoid " << hoid
+ << " prior_version or op type indicates creation,"
+ << " deleting"
+ << dendl;
if (missing.is_missing(hoid))
missing.rm(missing.missing.find(hoid));
if (rollbacker && !object_not_in_store)
if (missing.is_missing(hoid)) {
/// Case 3)
- dout(10) << __func__ << ": hoid " << hoid
- << " missing, " << missing.missing[hoid]
- << " adjusting" << dendl;
+ ldpp_dout(dpp, 10) << __func__ << ": hoid " << hoid
+ << " missing, " << missing.missing[hoid]
+ << " adjusting" << dendl;
if (missing.missing[hoid].have == prior_version) {
- dout(10) << __func__ << ": hoid " << hoid
+ ldpp_dout(dpp, 10) << __func__ << ": hoid " << hoid
<< " missing.have is prior_version " << prior_version
<< " removing from missing" << dendl;
missing.rm(missing.missing.find(hoid));
} else {
- dout(10) << __func__ << ": hoid " << hoid
- << " missing.have is " << missing.missing[hoid].have
- << ", adjusting" << dendl;
+ ldpp_dout(dpp, 10) << __func__ << ": hoid " << hoid
+ << " missing.have is " << missing.missing[hoid].have
+ << ", adjusting" << dendl;
missing.revise_need(hoid, prior_version);
if (prior_version <= info.log_tail) {
- dout(10) << __func__ << ": hoid " << hoid
- << " prior_version " << prior_version << " <= info.log_tail "
- << info.log_tail << dendl;
+ ldpp_dout(dpp, 10) << __func__ << ": hoid " << hoid
+ << " prior_version " << prior_version
+ << " <= info.log_tail "
+ << info.log_tail << dendl;
if (new_divergent_prior)
*new_divergent_prior = make_pair(prior_version, hoid);
}
return;
}
- dout(10) << __func__ << ": hoid " << hoid
- << " must be rolled back or recovered, attempting to rollback"
- << dendl;
+ ldpp_dout(dpp, 10) << __func__ << ": hoid " << hoid
+ << " must be rolled back or recovered,"
+ << " attempting to rollback"
+ << dendl;
bool can_rollback = true;
/// Distinguish between 4) and 5)
for (list<pg_log_entry_t>::const_reverse_iterator i = entries.rbegin();
i != entries.rend();
++i) {
if (!i->mod_desc.can_rollback() || i->version <= olog_can_rollback_to) {
- dout(10) << __func__ << ": hoid " << hoid << " cannot rollback "
- << *i << dendl;
+ ldpp_dout(dpp, 10) << __func__ << ": hoid " << hoid << " cannot rollback "
+ << *i << dendl;
can_rollback = false;
break;
}
i != entries.rend();
++i) {
assert(i->mod_desc.can_rollback() && i->version > olog_can_rollback_to);
- dout(10) << __func__ << ": hoid " << hoid
- << " rolling back " << *i << dendl;
+ ldpp_dout(dpp, 10) << __func__ << ": hoid " << hoid
+ << " rolling back " << *i << dendl;
if (rollbacker)
rollbacker->rollback(*i);
}
- dout(10) << __func__ << ": hoid " << hoid << " rolled back" << dendl;
+ ldpp_dout(dpp, 10) << __func__ << ": hoid " << hoid
+ << " rolled back" << dendl;
return;
} else {
/// Case 5)
- dout(10) << __func__ << ": hoid " << hoid << " cannot roll back, "
- << "removing and adding to missing" << dendl;
+ ldpp_dout(dpp, 10) << __func__ << ": hoid " << hoid << " cannot roll back, "
+ << "removing and adding to missing" << dendl;
if (rollbacker && !object_not_in_store)
rollbacker->remove(hoid);
missing.add(hoid, prior_version, eversion_t());
if (prior_version <= info.log_tail) {
- dout(10) << __func__ << ": hoid " << hoid
- << " prior_version " << prior_version << " <= info.log_tail "
- << info.log_tail << dendl;
+ ldpp_dout(dpp, 10) << __func__ << ": hoid " << hoid
+ << " prior_version " << prior_version
+ << " <= info.log_tail "
+ << info.log_tail << dendl;
if (new_divergent_prior)
*new_divergent_prior = make_pair(prior_version, hoid);
}
log.can_rollback_to,
missing,
&new_priors,
- rollbacker);
+ rollbacker,
+ this);
for (map<eversion_t, hobject_t>::iterator i = new_priors.begin();
i != new_priors.end();
++i) {
log.can_rollback_to,
missing,
&new_priors,
- rollbacker);
+ rollbacker,
+ this);
for (map<eversion_t, hobject_t>::iterator i = new_priors.begin();
i != new_priors.end();
++i) {
void PGLog::read_log(ObjectStore *store, coll_t pg_coll,
coll_t log_coll,
- ghobject_t log_oid,
- const pg_info_t &info,
- map<eversion_t, hobject_t> &divergent_priors,
- IndexedLog &log,
- pg_missing_t &missing,
- ostringstream &oss,
- set<string> *log_keys_debug)
+ ghobject_t log_oid,
+ const pg_info_t &info,
+ map<eversion_t, hobject_t> &divergent_priors,
+ IndexedLog &log,
+ pg_missing_t &missing,
+ ostringstream &oss,
+ const DoutPrefixProvider *dpp,
+ set<string> *log_keys_debug)
{
- dout(20) << "read_log coll " << pg_coll << " log_oid " << log_oid << dendl;
+ ldpp_dout(dpp, 20) << "read_log coll " << pg_coll
+ << " log_oid " << log_oid << dendl;
// legacy?
struct stat st;
bufferlist bl = p->value();//Copy bufferlist before creating iterator
bufferlist::iterator bp = bl.begin();
if (p->key() == "divergent_priors") {
- ::decode(divergent_priors, bp);
- dout(20) << "read_log " << divergent_priors.size() << " divergent_priors" << dendl;
+ ::decode(divergent_priors, bp);
+ ldpp_dout(dpp, 20) << "read_log " << divergent_priors.size()
+ << " divergent_priors" << dendl;
} else if (p->key() == "can_rollback_to") {
::decode(log.can_rollback_to, bp);
} else if (p->key() == "rollback_info_trimmed_to") {
::decode(log.rollback_info_trimmed_to, bp);
} else {
- pg_log_entry_t e;
- e.decode_with_checksum(bp);
- dout(20) << "read_log " << e << dendl;
- if (!log.log.empty()) {
- pg_log_entry_t last_e(log.log.back());
- assert(last_e.version.version < e.version.version);
- assert(last_e.version.epoch <= e.version.epoch);
- }
- log.log.push_back(e);
- log.head = e.version;
- if (log_keys_debug)
- log_keys_debug->insert(e.get_key_name());
+ pg_log_entry_t e;
+ e.decode_with_checksum(bp);
+ ldpp_dout(dpp, 20) << "read_log " << e << dendl;
+ if (!log.log.empty()) {
+ pg_log_entry_t last_e(log.log.back());
+ assert(last_e.version.version < e.version.version);
+ assert(last_e.version.epoch <= e.version.epoch);
+ }
+ log.log.push_back(e);
+ log.head = e.version;
+ if (log_keys_debug)
+ log_keys_debug->insert(e.get_key_name());
}
}
}
// build missing
if (info.last_complete < info.last_update) {
- dout(10) << "read_log checking for missing items over interval (" << info.last_complete
- << "," << info.last_update << "]" << dendl;
+ ldpp_dout(dpp, 10) << "read_log checking for missing items over interval ("
+ << info.last_complete
+ << "," << info.last_update << "]" << dendl;
set<hobject_t, hobject_t::BitwiseComparator> did;
for (list<pg_log_entry_t>::reverse_iterator i = log.log.rbegin();
if (r >= 0) {
object_info_t oi(bv);
if (oi.version < i->version) {
- dout(15) << "read_log missing " << *i << " (have " << oi.version << ")" << dendl;
+ ldpp_dout(dpp, 15) << "read_log missing " << *i
+ << " (have " << oi.version << ")" << dendl;
missing.add(i->soid, i->version, oi.version);
}
} else {
- dout(15) << "read_log missing " << *i << dendl;
+ ldpp_dout(dpp, 15) << "read_log missing " << *i << dendl;
missing.add(i->soid, i->version, eversion_t());
}
}
*/
assert(oi.version == i->first);
} else {
- dout(15) << "read_log missing " << *i << dendl;
+ ldpp_dout(dpp, 15) << "read_log missing " << *i << dendl;
missing.add(i->second, i->first, eversion_t());
}
}
}
- dout(10) << "read_log done" << dendl;
+ ldpp_dout(dpp, 10) << "read_log done" << dendl;
}
#define PGLOG_INDEXED_EXTRA_CALLER_OPS (1 << 2)
#define PGLOG_INDEXED_ALL (PGLOG_INDEXED_OBJECTS | PGLOG_INDEXED_CALLER_OPS | PGLOG_INDEXED_EXTRA_CALLER_OPS)
-struct PGLog {
+struct PGLog : DoutPrefixProvider {
+ DoutPrefixProvider *prefix_provider;
+ string gen_prefix() const {
+ return prefix_provider ? prefix_provider->gen_prefix() : "";
+ }
+ unsigned get_subsys() const {
+ return prefix_provider ? prefix_provider->get_subsys() : ceph_subsys_osd;
+ }
+ CephContext *get_cct() const {
+ return cct;
+ }
+
////////////////////////////// sub classes //////////////////////////////
struct LogEntryHandler {
virtual void rollback(
}
public:
// cppcheck-suppress noExplicitConstructor
- PGLog(CephContext *cct = 0) :
+ PGLog(CephContext *cct, DoutPrefixProvider *dpp = 0) :
+ prefix_provider(dpp),
dirty_from(eversion_t::max()),
writeout_from(eversion_t::max()),
cct(cct),
eversion_t olog_can_rollback_to, ///< [in] rollback boundary
pg_missing_t &omissing, ///< [in,out] missing to adjust, use
boost::optional<pair<eversion_t, hobject_t> > *new_divergent_prior,
- LogEntryHandler *rollbacker ///< [in] optional rollbacker object
+ LogEntryHandler *rollbacker, ///< [in] optional rollbacker object
+ const DoutPrefixProvider *dpp ///< [in] logging provider
);
/// Merge all entries using above
eversion_t olog_can_rollback_to, ///< [in] rollback boundary
pg_missing_t &omissing, ///< [in,out] missing to adjust, use
map<eversion_t, hobject_t> *priors, ///< [out] target for new priors
- LogEntryHandler *rollbacker ///< [in] optional rollbacker object
+ LogEntryHandler *rollbacker, ///< [in] optional rollbacker object
+ const DoutPrefixProvider *dpp ///< [in] logging provider
) {
map<hobject_t, list<pg_log_entry_t>, hobject_t::BitwiseComparator > split;
split_by_object(entries, &split);
olog_can_rollback_to,
omissing,
&new_divergent_prior,
- rollbacker);
+ rollbacker,
+ dpp);
if (priors && new_divergent_prior) {
(*priors)[new_divergent_prior->first] = new_divergent_prior->second;
}
log.can_rollback_to,
missing,
&new_divergent_prior,
- rollbacker);
+ rollbacker,
+ this);
if (new_divergent_prior)
add_divergent_prior(
(*new_divergent_prior).first,
return read_log(
store, pg_coll, log_coll, log_oid, info, divergent_priors,
log, missing, oss,
+ this,
(pg_log_debug ? &log_keys_debug : 0));
}
const pg_info_t &info, map<eversion_t, hobject_t> &divergent_priors,
IndexedLog &log,
pg_missing_t &missing, ostringstream &oss,
+ const DoutPrefixProvider *dpp = NULL,
set<string> *log_keys_debug = 0
);
};