set<string>* trimmed_dups,
eversion_t *write_from_dups)
{
+ lgeneric_subdout(cct, osd, 10) << "IndexedLog::trim s=" << s << dendl;
ceph_assert(s <= can_rollback_to);
if (complete_to != log.end())
lgeneric_subdout(cct, osd, 20) << " complete_to " << complete_to->version << dendl;
// raise tail?
if (tail < s)
tail = s;
+ lgeneric_subdout(cct, osd, 20) << "IndexedLog::trim after trim"
+ << " dups.size()=" << dups.size()
+ << " tail=" << tail
+ << " s=" << s << dendl;
}
ostream& PGLog::IndexedLog::print(ostream& out) const
// returns true if any changes were made to log.dups
bool PGLog::merge_log_dups(const pg_log_t& olog) {
+ dout(5) << __func__
+ << " log.dups.size()=" << log.dups.size()
+ << "olog.dups.size()=" << olog.dups.size() << dendl;
bool changed = false;
if (!olog.dups.empty()) {
}
}
+ dout(5) << "end of " << __func__ << " changed=" << changed
+ << " log.dups.size()=" << log.dups.size()
+ << " olog.dups.size()=" << olog.dups.size() << dendl;
+
return changed;
}
const DoutPrefixProvider *dpp
)
{
- // dout(10) << "write_log_and_missing, clearing up to " << dirty_to << dendl;
+ ldpp_dout(dpp, 10) << "_write_log_and_missing_wo_missing, clearing up to " << dirty_to
+ << " dirty_to_dups=" << dirty_to_dups
+ << " dirty_from_dups=" << dirty_from_dups
+ << " write_from_dups=" << write_from_dups << dendl;
if (touch_log)
t.touch(coll, log_oid);
if (dirty_to != eversion_t()) {
if (dirty_to_dups != eversion_t()) {
pg_log_dup_t min, dirty_to_dup;
dirty_to_dup.version = dirty_to_dups;
+ ldpp_dout(dpp, 10) << __func__ << " remove dups min=" << min.get_key_name()
+ << " to dirty_to_dup=" << dirty_to_dup.get_key_name() << dendl;
t.omap_rmkeyrange(
coll, log_oid,
min.get_key_name(), dirty_to_dup.get_key_name());
pg_log_dup_t max, dirty_from_dup;
max.version = eversion_t::max();
dirty_from_dup.version = dirty_from_dups;
+ ldpp_dout(dpp, 10) << __func__ << " remove dups dirty_from_dup="
+ << dirty_from_dup.get_key_name()
+ << " to max=" << max.get_key_name() << dendl;
t.omap_rmkeyrange(
coll, log_oid,
dirty_from_dup.get_key_name(), max.get_key_name());
}
+ ldpp_dout(dpp, 10) << __func__ << " going to encode log.dups.size()="
+ << log.dups.size() << dendl;
for (const auto& entry : log.dups) {
if (entry.version > dirty_to_dups)
break;
encode(entry, bl);
(*km)[entry.get_key_name()] = std::move(bl);
}
-
+ ldpp_dout(dpp, 10) << __func__ << " 1st round encoded log.dups.size()="
+ << log.dups.size() << dendl;
for (auto p = log.dups.rbegin();
p != log.dups.rend() &&
(p->version >= dirty_from_dups || p->version >= write_from_dups) &&
encode(*p, bl);
(*km)[p->get_key_name()] = std::move(bl);
}
+ ldpp_dout(dpp, 10) << __func__ << " 2st round encoded log.dups.size()="
+ << log.dups.size() << dendl;
if (dirty_divergent_priors) {
- //dout(10) << "write_log_and_missing: writing divergent_priors" << dendl;
+ ldpp_dout(dpp, 10) << "write_log_and_missing: writing divergent_priors"
+ << dendl;
encode(divergent_priors, (*km)["divergent_priors"]);
}
if (require_rollback) {
log.get_rollback_info_trimmed_to(),
(*km)["rollback_info_trimmed_to"]);
}
+ ldpp_dout(dpp, 10) << "end of " << __func__ << dendl;
}
// static
set<string> *log_keys_debug,
const DoutPrefixProvider *dpp
) {
+ ldpp_dout(dpp, 10) << __func__ << " clearing up to " << dirty_to
+ << " dirty_to_dups=" << dirty_to_dups
+ << " dirty_from_dups=" << dirty_from_dups
+ << " write_from_dups=" << write_from_dups
+ << " trimmed_dups.size()=" << trimmed_dups.size() << dendl;
set<string> to_remove;
to_remove.swap(trimmed_dups);
for (auto& t : trimmed) {
clear_up_to(log_keys_debug, dirty_to.get_key_name());
}
if (dirty_to != eversion_t::max() && dirty_from != eversion_t::max()) {
- // dout(10) << "write_log_and_missing, clearing from " << dirty_from << dendl;
+ ldpp_dout(dpp, 10) << "write_log_and_missing, clearing from "
+ << dirty_from << dendl;
t.omap_rmkeyrange(
coll, log_oid,
dirty_from.get_key_name(), eversion_t::max().get_key_name());
if (dirty_to_dups != eversion_t()) {
pg_log_dup_t min, dirty_to_dup;
dirty_to_dup.version = dirty_to_dups;
+ ldpp_dout(dpp, 10) << __func__ << " remove dups min=" << min.get_key_name()
+ << " to dirty_to_dup=" << dirty_to_dup.get_key_name() << dendl;
t.omap_rmkeyrange(
coll, log_oid,
min.get_key_name(), dirty_to_dup.get_key_name());
pg_log_dup_t max, dirty_from_dup;
max.version = eversion_t::max();
dirty_from_dup.version = dirty_from_dups;
+ ldpp_dout(dpp, 10) << __func__ << " remove dups dirty_from_dup="
+ << dirty_from_dup.get_key_name()
+ << " to max=" << max.get_key_name() << dendl;
t.omap_rmkeyrange(
coll, log_oid,
dirty_from_dup.get_key_name(), max.get_key_name());
}
+ ldpp_dout(dpp, 10) << __func__ << " going to encode log.dups.size()="
+ << log.dups.size() << dendl;
for (const auto& entry : log.dups) {
if (entry.version > dirty_to_dups)
break;
encode(entry, bl);
(*km)[entry.get_key_name()] = std::move(bl);
}
+ ldpp_dout(dpp, 10) << __func__ << " 1st round encoded log.dups.size()="
+ << log.dups.size() << dendl;
for (auto p = log.dups.rbegin();
p != log.dups.rend() &&
encode(*p, bl);
(*km)[p->get_key_name()] = std::move(bl);
}
+ ldpp_dout(dpp, 10) << __func__ << " 2st round encoded log.dups.size()="
+ << log.dups.size() << dendl;
if (clear_divergent_priors) {
- //dout(10) << "write_log_and_missing: writing divergent_priors" << dendl;
+ ldpp_dout(dpp, 10) << "write_log_and_missing: writing divergent_priors"
+ << dendl;
to_remove.insert("divergent_priors");
}
// since we encode individual missing items instead of a whole
if (!to_remove.empty())
t.omap_rmkeys(coll, log_oid, to_remove);
+ ldpp_dout(dpp, 10) << "end of " << __func__ << dendl;
}
void PGLog::rebuild_missing_set_with_deletes(
{
auto earliest_dup_version =
target.head.version < maxdups ? 0u : target.head.version - maxdups + 1;
- lgeneric_subdout(cct, osd, 20) << "copy_up_to/copy_after earliest_dup_version " << earliest_dup_version << dendl;
+ lgeneric_subdout(cct, osd, 20) << __func__ << " earliest_dup_version "
+ << earliest_dup_version << dendl;
for (auto d = other.dups.cbegin(); d != other.dups.cend(); ++d) {
if (d->version.version >= earliest_dup_version) {
can_rollback_to = other.can_rollback_to;
head = other.head;
tail = other.tail;
- lgeneric_subdout(cct, osd, 20) << __func__ << " v " << v << dendl;
+ lgeneric_subdout(cct, osd, 20) << __func__ << " v " << v
+ << " dups.size()=" << dups.size()
+ << " other.dups.size()=" << other.dups.size() << dendl;
for (auto i = other.log.crbegin(); i != other.log.crend(); ++i) {
ceph_assert(i->version > other.tail);
if (i->version <= v) {
log.push_front(*i);
}
_handle_dups(cct, *this, other, cct->_conf->osd_pg_log_dups_tracked);
+ lgeneric_subdout(cct, osd, 20) << __func__ << " END v " << v
+ << " dups.size()=" << dups.size()
+ << " other.dups.size()=" << other.dups.size() << dendl;
}
void pg_log_t::copy_up_to(CephContext* cct, const pg_log_t &other, int max)
int n = 0;
head = other.head;
tail = other.tail;
- lgeneric_subdout(cct, osd, 20) << __func__ << " max " << max << dendl;
+ lgeneric_subdout(cct, osd, 20) << __func__ << " max " << max
+ << " dups.size()=" << dups.size()
+ << " other.dups.size()=" << other.dups.size() << dendl;
for (auto i = other.log.crbegin(); i != other.log.crend(); ++i) {
ceph_assert(i->version > other.tail);
if (n++ >= max) {
log.push_front(*i);
}
_handle_dups(cct, *this, other, cct->_conf->osd_pg_log_dups_tracked);
+ lgeneric_subdout(cct, osd, 20) << __func__ << " END max " << max
+ << " dups.size()=" << dups.size()
+ << " other.dups.size()=" << other.dups.size() << dendl;
}
ostream& pg_log_t::print(ostream& out) const