From: Samuel Just Date: Mon, 2 Jun 2014 20:44:49 +0000 (-0700) Subject: osd/: in scrub, check for and remove obsolete rollback objs X-Git-Tag: v0.84~171^2~1 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=d48a737a6f8daa463ddf82106455b2efe7715a33;p=ceph.git osd/: in scrub, check for and remove obsolete rollback objs Signed-off-by: Samuel Just --- diff --git a/src/osd/PG.cc b/src/osd/PG.cc index 3be06f0010aa..6c50eda6d849 100644 --- a/src/osd/PG.cc +++ b/src/osd/PG.cc @@ -1442,7 +1442,7 @@ void PG::activate(ObjectStore::Transaction& t, min_last_complete_ondisk = eversion_t(0,0); // we don't know (yet)! } last_update_applied = info.last_update; - + last_rollback_info_trimmed_to_applied = pg_log.get_rollback_trimmed_to(); need_up_thru = false; @@ -2661,10 +2661,20 @@ void PG::append_log( PGLogEntryHandler handler; if (!transaction_applied) { pg_log.clear_can_rollback_to(&handler); + t.register_on_applied( + new C_UpdateLastRollbackInfoTrimmedToApplied( + this, + get_osdmap()->get_epoch(), + info.last_update)); } else if (trim_rollback_to > pg_log.get_rollback_trimmed_to()) { pg_log.trim_rollback_info( trim_rollback_to, &handler); + t.register_on_applied( + new C_UpdateLastRollbackInfoTrimmedToApplied( + this, + get_osdmap()->get_epoch(), + trim_rollback_to)); } dout(10) << "append_log adding " << keys.size() << " keys" << dendl; @@ -3274,6 +3284,34 @@ void PG::scrub_unreserve_replicas() } } +void PG::_scan_rollback_obs( + const vector &rollback_obs, + ThreadPool::TPHandle &handle) +{ + ObjectStore::Transaction *t = NULL; + eversion_t trimmed_to = last_rollback_info_trimmed_to_applied; + for (vector::const_iterator i = rollback_obs.begin(); + i != rollback_obs.end(); + ++i) { + if (i->generation < trimmed_to.version) { + osd->clog.error() << "osd." << osd->whoami + << " pg " << info.pgid + << " found obsolete rollback obj " + << *i << " generation < trimmed_to " + << trimmed_to + << "...repaired"; + if (!t) + t = new ObjectStore::Transaction; + t->remove(coll, *i); + } + } + if (t) { + derr << __func__ << ": queueing trans to clean up obsolete rollback objs" + << dendl; + osd->store->queue_transaction_and_cleanup(osr.get(), t); + } +} + void PG::_scan_snaps(ScrubMap &smap) { for (map::iterator i = smap.objects.begin(); @@ -3361,13 +3399,21 @@ int PG::build_scrub_map_chunk( // objects vector ls; - int ret = get_pgbackend()->objects_list_range(start, end, 0, &ls); + vector rollback_obs; + int ret = get_pgbackend()->objects_list_range( + start, + end, + 0, + &ls, + &rollback_obs); if (ret < 0) { dout(5) << "objects_list_range error: " << ret << dendl; return ret; } + get_pgbackend()->be_scan_list(map, ls, deep, handle); + _scan_rollback_obs(rollback_obs, handle); _scan_snaps(map); // pg attrs diff --git a/src/osd/PG.h b/src/osd/PG.h index 7fd52fd20112..1ae66160f1f9 100644 --- a/src/osd/PG.h +++ b/src/osd/PG.h @@ -447,6 +447,25 @@ public: eversion_t last_complete_ondisk; // last_complete that has committed. eversion_t last_update_applied; + + struct C_UpdateLastRollbackInfoTrimmedToApplied : Context { + PGRef pg; + epoch_t e; + eversion_t v; + C_UpdateLastRollbackInfoTrimmedToApplied(PG *pg, epoch_t e, eversion_t v) + : pg(pg), e(e), v(v) {} + void finish(int) { + pg->lock(); + if (!pg->pg_has_reset_since(e)) { + pg->last_rollback_info_trimmed_to_applied = v; + } + pg->unlock(); + } + }; + // entries <= last_rollback_info_trimmed_to_applied have been trimmed, + // and the transaction has applied + eversion_t last_rollback_info_trimmed_to_applied; + // primary state public: pg_shard_t primary; @@ -1108,6 +1127,9 @@ public: void scrub_clear_state(); bool scrub_gather_replica_maps(); void _scan_snaps(ScrubMap &map); + void _scan_rollback_obs( + const vector &rollback_obs, + ThreadPool::TPHandle &handle); void _request_scrub_map_classic(pg_shard_t replica, eversion_t version); void _request_scrub_map(pg_shard_t replica, eversion_t version, hobject_t start, hobject_t end, bool deep); diff --git a/src/osd/PGBackend.cc b/src/osd/PGBackend.cc index dad17f9cd261..6a1a818eae68 100644 --- a/src/osd/PGBackend.cc +++ b/src/osd/PGBackend.cc @@ -148,7 +148,8 @@ int PGBackend::objects_list_range( const hobject_t &start, const hobject_t &end, snapid_t seq, - vector *ls) + vector *ls, + vector *gen_obs) { assert(ls); vector objects; @@ -164,6 +165,8 @@ int PGBackend::objects_list_range( ++i) { if (i->is_no_gen()) { ls->push_back(i->hobj); + } else if (gen_obs) { + gen_obs->push_back(*i); } } return r; diff --git a/src/osd/PGBackend.h b/src/osd/PGBackend.h index 707252704a66..b91eb2a6c157 100644 --- a/src/osd/PGBackend.h +++ b/src/osd/PGBackend.h @@ -553,7 +553,8 @@ const hobject_t &start, const hobject_t &end, snapid_t seq, - vector *ls); + vector *ls, + vector *gen_obs=0); int objects_get_attr( const hobject_t &hoid, diff --git a/src/osd/PGLog.h b/src/osd/PGLog.h index 8d0701f36537..ca4763068a07 100644 --- a/src/osd/PGLog.h +++ b/src/osd/PGLog.h @@ -372,6 +372,10 @@ public: h); } + eversion_t get_rollback_trimmed_to() const { + 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(