]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
osd/: in scrub, check for and remove obsolete rollback objs
authorSamuel Just <sam.just@inktank.com>
Mon, 2 Jun 2014 20:44:49 +0000 (13:44 -0700)
committerSamuel Just <sam.just@inktank.com>
Fri, 27 Jun 2014 20:25:52 +0000 (13:25 -0700)
Signed-off-by: Samuel Just <sam.just@inktank.com>
src/osd/PG.cc
src/osd/PG.h
src/osd/PGBackend.cc
src/osd/PGBackend.h
src/osd/PGLog.h

index 3be06f0010aaa171cf7e8518947f70d458f13e5e..6c50eda6d84969dff0b63955667b6c844586f196 100644 (file)
@@ -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<ghobject_t> &rollback_obs,
+  ThreadPool::TPHandle &handle)
+{
+  ObjectStore::Transaction *t = NULL;
+  eversion_t trimmed_to = last_rollback_info_trimmed_to_applied;
+  for (vector<ghobject_t>::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<hobject_t, ScrubMap::object>::iterator i = smap.objects.begin();
@@ -3361,13 +3399,21 @@ int PG::build_scrub_map_chunk(
 
   // objects
   vector<hobject_t> ls;
-  int ret = get_pgbackend()->objects_list_range(start, end, 0, &ls);
+  vector<ghobject_t> 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
index 7fd52fd2011211ceb4df0ea572172f3e87d2c547..1ae66160f1f9fb616bed5b37d744953ca3e072ee 100644 (file)
@@ -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<ghobject_t> &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);
index dad17f9cd2619f9efa12d1df49b4519ea734212f..6a1a818eae6874445e4d74c99ac5b5e37ba86090 100644 (file)
@@ -148,7 +148,8 @@ int PGBackend::objects_list_range(
   const hobject_t &start,
   const hobject_t &end,
   snapid_t seq,
-  vector<hobject_t> *ls)
+  vector<hobject_t> *ls,
+  vector<ghobject_t> *gen_obs)
 {
   assert(ls);
   vector<ghobject_t> 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;
index 707252704a66552c1e3eeb0ce67880a7269738fb..b91eb2a6c157f894b00181e80ce55a5434b0ebb0 100644 (file)
      const hobject_t &start,
      const hobject_t &end,
      snapid_t seq,
-     vector<hobject_t> *ls);
+     vector<hobject_t> *ls,
+     vector<ghobject_t> *gen_obs=0);
 
    int objects_get_attr(
      const hobject_t &hoid,
index 8d0701f36537a75bd746bd422c3e8c3dcfdf24b8..ca4763068a07293ae766de308a2c95b972c565fa 100644 (file)
@@ -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(