This is only needed for the lost/unfound use of submit_log_entries() etc.
Signed-off-by: Josh Durgin <jdurgin@redhat.com>
}
}
-void PG::append_log_entries_update_missing(
+bool PG::append_log_entries_update_missing(
const list<pg_log_entry_t> &entries,
ObjectStore::Transaction &t)
{
assert(entries.begin()->version > info.last_update);
PGLogEntryHandler rollbacker;
- pg_log.append_new_log_entries(
- info.last_backfill,
- info.last_backfill_bitwise,
- entries,
- &rollbacker);
+ bool invalidate_stats =
+ pg_log.append_new_log_entries(info.last_backfill,
+ info.last_backfill_bitwise,
+ entries,
+ &rollbacker);
rollbacker.apply(this, &t);
info.last_update = pg_log.get_head();
info.last_complete = info.last_update;
}
- info.stats.stats_invalid = true;
+ info.stats.stats_invalid = info.stats.stats_invalid || invalidate_stats;
dirty_info = true;
write_if_dirty(t);
+ return invalidate_stats;
}
dout(10) << __func__ << " " << entries << dendl;
assert(is_primary());
- append_log_entries_update_missing(entries, t);
+ bool rebuild_missing = append_log_entries_update_missing(entries, t);
for (set<pg_shard_t>::const_iterator i = actingbackfill.begin();
i != actingbackfill.end();
++i) {
assert(peer_info.count(peer));
pg_missing_t& pmissing(peer_missing[peer]);
pg_info_t& pinfo(peer_info[peer]);
- PGLog::append_log_entries_update_missing(
+ bool invalidate_stats = PGLog::append_log_entries_update_missing(
pinfo.last_backfill,
info.last_backfill_bitwise,
entries,
NULL,
this);
pinfo.last_update = info.last_update;
- pinfo.stats.stats_invalid = true;
+ pinfo.stats.stats_invalid = pinfo.stats.stats_invalid || invalidate_stats;
+ rebuild_missing = rebuild_missing || invalidate_stats;
}
+
+ if (!rebuild_missing) {
+ return;
+ }
+
for (auto &&i: entries) {
missing_loc.rebuild(
i.soid,
void share_pg_info();
- void append_log_entries_update_missing(
+ bool append_log_entries_update_missing(
const list<pg_log_entry_t> &entries,
ObjectStore::Transaction &t);
dirty_big_info = true;
}
-void PGLog::append_log_entries_update_missing(
+bool PGLog::append_log_entries_update_missing(
const hobject_t &last_backfill,
bool last_backfill_bitwise,
const list<pg_log_entry_t> &entries,
LogEntryHandler *rollbacker,
const DoutPrefixProvider *dpp)
{
+ bool invalidate_stats = false;
if (log && !entries.empty()) {
assert(log->head < entries.begin()->version);
log->head = entries.rbegin()->version;
for (list<pg_log_entry_t>::const_iterator p = entries.begin();
p != entries.end();
++p) {
+ invalidate_stats = invalidate_stats || !p->is_error();
if (log) {
log->log.push_back(*p);
pg_log_entry_t &ne = log->log.back();
}
if (log)
log->reset_rollback_info_trimmed_to_riter();
+ return invalidate_stats;
}
void PGLog::merge_log(ObjectStore::Transaction& t,
pg_info_t &info, LogEntryHandler *rollbacker,
bool &dirty_info, bool &dirty_big_info);
- static void append_log_entries_update_missing(
+ static bool append_log_entries_update_missing(
const hobject_t &last_backfill,
bool last_backfill_bitwise,
const list<pg_log_entry_t> &entries,
pg_missing_t &missing,
LogEntryHandler *rollbacker,
const DoutPrefixProvider *dpp);
- void append_new_log_entries(
+ bool append_new_log_entries(
const hobject_t &last_backfill,
bool last_backfill_bitwise,
const list<pg_log_entry_t> &entries,
LogEntryHandler *rollbacker) {
- append_log_entries_update_missing(
+ bool invalidate_stats = append_log_entries_update_missing(
last_backfill,
last_backfill_bitwise,
entries,
if (!entries.empty()) {
mark_writeout_from(entries.begin()->version);
}
+ return invalidate_stats;
}
void write_log(ObjectStore::Transaction& t,
/**
* Merge entries atomically into all actingbackfill osds
- * adjusting missing and recovery state as necessary
+ * adjusting missing and recovery state as necessary.
+ *
+ * Also used to store error log entries for dup detection.
*/
void submit_log_entries(
const list<pg_log_entry_t> &entries,