From: Samuel Just Date: Sat, 27 Aug 2016 19:51:18 +0000 (-0700) Subject: osd/: split rollback info trims into trims and rollforwards X-Git-Tag: v11.1.0~245^2~20 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=4a193e828d456a7c301cdac455c33c1b6e57265c;p=ceph-ci.git osd/: split rollback info trims into trims and rollforwards Also, rollforward on activate() and adjust read_log debugging to account for non-rollforward entries. Signed-off-by: Samuel Just --- diff --git a/src/osd/PG.cc b/src/osd/PG.cc index 660dae066af..fc466a40824 100644 --- a/src/osd/PG.cc +++ b/src/osd/PG.cc @@ -1848,6 +1848,11 @@ void PG::activate(ObjectStore::Transaction& t, state_set(PG_STATE_ACTIVATING); } + if (acting.size() >= pool.info.min_size) { + PGLogEntryHandler handler; + pg_log.roll_forward(&handler); + handler.apply(this, &t); + } } bool PG::op_has_sufficient_caps(OpRequestRef& op) @@ -3056,14 +3061,14 @@ void PG::append_log( PGLogEntryHandler handler; if (!transaction_applied) { - pg_log.clear_can_rollback_to(&handler); + pg_log.roll_forward(&handler); t.register_on_applied( new C_UpdateLastRollbackInfoTrimmedToApplied( this, get_osdmap()->get_epoch(), info.last_update)); } else if (roll_forward_to > pg_log.get_rollback_trimmed_to()) { - pg_log.trim_rollback_info( + pg_log.roll_forward_to( roll_forward_to, &handler); t.register_on_applied( @@ -3075,7 +3080,7 @@ void PG::append_log( pg_log.trim(&handler, trim_to, info); - dout(10) << __func__ << ": trimming to " << roll_forward_to + dout(10) << __func__ << ": rolling forward to " << roll_forward_to << " entries " << handler.to_trim << dendl; handler.apply(this, &t); diff --git a/src/osd/PG.h b/src/osd/PG.h index 80133717a2f..891fe991c64 100644 --- a/src/osd/PG.h +++ b/src/osd/PG.h @@ -988,6 +988,9 @@ public: void rollback(const pg_log_entry_t &entry) { to_rollback.push_back(entry); } + void rollforward(const pg_log_entry_t &entry) { + to_trim.push_back(entry); + } void trim(const pg_log_entry_t &entry) { to_trim.push_back(entry); } diff --git a/src/osd/PGLog.cc b/src/osd/PGLog.cc index 3f9870fe9eb..b0fc2e25e2b 100644 --- a/src/osd/PGLog.cc +++ b/src/osd/PGLog.cc @@ -30,25 +30,6 @@ static ostream& _prefix(std::ostream *_dout, const PGLog *pglog) //////////////////// PGLog::IndexedLog //////////////////// -void PGLog::IndexedLog::advance_rollback_info_trimmed_to( - eversion_t to, - LogEntryHandler *h) -{ - assert(to <= can_rollback_to); - - if (to > rollback_info_trimmed_to) - rollback_info_trimmed_to = to; - - while (rollback_info_trimmed_to_riter != log.rbegin()) { - --rollback_info_trimmed_to_riter; - if (rollback_info_trimmed_to_riter->version > rollback_info_trimmed_to) { - ++rollback_info_trimmed_to_riter; - break; - } - h->trim(*rollback_info_trimmed_to_riter); - } -} - void PGLog::IndexedLog::filter_log(spg_t pgid, const OSDMap &map, const string &hit_set_namespace) { IndexedLog out; @@ -104,7 +85,7 @@ void PGLog::IndexedLog::trim( if (s > can_rollback_to) can_rollback_to = s; - advance_rollback_info_trimmed_to(s, handler); + trim_rollback_info_to(s, handler); while (!log.empty()) { pg_log_entry_t &e = *log.begin(); diff --git a/src/osd/PGLog.h b/src/osd/PGLog.h index 25b4412d321..864866f98f0 100644 --- a/src/osd/PGLog.h +++ b/src/osd/PGLog.h @@ -48,6 +48,8 @@ struct PGLog : DoutPrefixProvider { struct LogEntryHandler { virtual void rollback( const pg_log_entry_t &entry) = 0; + virtual void rollforward( + const pg_log_entry_t &entry) = 0; virtual void remove( const hobject_t &hoid) = 0; virtual void try_stash( @@ -96,7 +98,36 @@ struct PGLog : DoutPrefixProvider { */ list::reverse_iterator rollback_info_trimmed_to_riter; public: - void advance_rollback_info_trimmed_to(eversion_t to, LogEntryHandler *h); + template + void advance_can_rollback_to(eversion_t to, F &&f) { + assert(to <= can_rollback_to); + + if (to > rollback_info_trimmed_to) + rollback_info_trimmed_to = to; + + while (rollback_info_trimmed_to_riter != log.rbegin()) { + --rollback_info_trimmed_to_riter; + if (rollback_info_trimmed_to_riter->version > rollback_info_trimmed_to) { + ++rollback_info_trimmed_to_riter; + break; + } + f(*rollback_info_trimmed_to_riter); + } + } + void trim_rollback_info_to(eversion_t to, LogEntryHandler *h) { + advance_can_rollback_to( + to, + [&](pg_log_entry_t &entry) { + h->trim(entry); + }); + } + void roll_forward_to(eversion_t to, LogEntryHandler *h) { + advance_can_rollback_to( + to, + [&](pg_log_entry_t &entry) { + h->rollforward(entry); + }); + } /****/ IndexedLog() : @@ -568,12 +599,12 @@ public: eversion_t trim_to, pg_info_t &info); - void trim_rollback_info( + void roll_forward_to( eversion_t roll_forward_to, LogEntryHandler *h) { if (roll_forward_to > log.can_rollback_to) log.can_rollback_to = roll_forward_to; - log.advance_rollback_info_trimmed_to( + log.roll_forward_to( roll_forward_to, h); } @@ -582,9 +613,8 @@ public: return log.rollback_info_trimmed_to; } - void clear_can_rollback_to(LogEntryHandler *h) { - log.can_rollback_to = log.head; - log.advance_rollback_info_trimmed_to( + void roll_forward(LogEntryHandler *h) { + roll_forward_to( log.head, h); } @@ -593,7 +623,7 @@ public: void reset_backfill_claim_log(const pg_log_t &o, LogEntryHandler *h) { log.can_rollback_to = log.head; - log.advance_rollback_info_trimmed_to(log.head, h); + log.trim_rollback_info_to(log.head, h); log.claim_log_and_clear_rollback_info(o); missing.clear(); mark_dirty_to(eversion_t::max()); @@ -1113,6 +1143,7 @@ public: set did; set checked; + set skipped; for (list::reverse_iterator i = log.log.rbegin(); i != log.log.rend(); ++i) { @@ -1124,6 +1155,9 @@ public: if (did.count(i->soid)) continue; did.insert(i->soid); + if (i->version > log.can_rollback_to && i->is_rollforward()) + checked.insert(i->soid); + if (i->is_delete()) continue; bufferlist bv; diff --git a/src/osd/ReplicatedPG.cc b/src/osd/ReplicatedPG.cc index 95b40d1a102..a72cc797bfc 100644 --- a/src/osd/ReplicatedPG.cc +++ b/src/osd/ReplicatedPG.cc @@ -9996,7 +9996,7 @@ void ReplicatedPG::on_removal(ObjectStore::Transaction *t) // clear log PGLogEntryHandler rollbacker; - pg_log.clear_can_rollback_to(&rollbacker); + pg_log.roll_forward(&rollbacker); rollbacker.apply(this, t); write_if_dirty(*t); diff --git a/src/osd/osd_types.h b/src/osd/osd_types.h index dffb6541852..67c9e8153ef 100644 --- a/src/osd/osd_types.h +++ b/src/osd/osd_types.h @@ -2828,6 +2828,8 @@ struct pg_log_entry_t { (op == MODIFY || op == DELETE || op == ERROR); } + bool is_rollforward() const { /* TODO */ return false; } + string get_key_name() const; void encode_with_checksum(bufferlist& bl) const; void decode_with_checksum(bufferlist::iterator& p); diff --git a/src/test/osd/TestPGLog.cc b/src/test/osd/TestPGLog.cc index 52981063a0a..d232288e94f 100644 --- a/src/test/osd/TestPGLog.cc +++ b/src/test/osd/TestPGLog.cc @@ -162,6 +162,8 @@ public: const pg_log_entry_t &entry) { rolledback.push_back(entry); } + void rollforward( + const pg_log_entry_t &entry) {} void remove( const hobject_t &hoid) { removed.insert(hoid); @@ -276,6 +278,8 @@ struct TestHandler : public PGLog::LogEntryHandler { void rollback( const pg_log_entry_t &entry) {} + void rollforward( + const pg_log_entry_t &entry) {} void remove( const hobject_t &hoid) { removed.push_back(hoid); @@ -483,7 +487,7 @@ TEST_F(PGLogTest, rewind_divergent_log) { add(e); } TestHandler h(remove_snap); - trim_rollback_info(eversion_t(1, 6), &h); + roll_forward_to(eversion_t(1, 6), &h); rewind_divergent_log(t, eversion_t(1, 5), info, &h, dirty_info, dirty_big_info); pg_log_t log;