]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
osd: make clean_up_local remove hardlinks from collection dirs
authorSage Weil <sage@newdream.net>
Fri, 11 Jun 2010 18:07:32 +0000 (11:07 -0700)
committerSage Weil <sage@newdream.net>
Thu, 17 Jun 2010 17:13:04 +0000 (10:13 -0700)
src/osd/ReplicatedPG.cc
src/osd/ReplicatedPG.h

index fc47a132c8028cfc085e0783dd5e8e76bf953c45..326f86a92b4c9b57d5b57eaf8d9f01d51f954fe3 100644 (file)
@@ -3851,6 +3851,21 @@ int ReplicatedPG::recover_replicas(int max)
 }
 
 
+void ReplicatedPG::remove_object_with_snap_hardlinks(ObjectStore::Transaction& t, const sobject_t& soid)
+{
+  t.remove(coll_t::build_pg_coll(info.pgid), soid);
+  if (soid.snap < CEPH_MAXSNAP) {
+    bufferlist ba;
+    int r = osd->store->getattr(coll_t::build_pg_coll(info.pgid), soid, OI_ATTR, ba);
+    if (r >= 0) {
+      // grr, need first snap bound, too.
+      object_info_t oi(ba);
+      if (oi.snaps[0] != soid.snap)
+       t.remove(coll_t::build_snap_pg_coll(info.pgid, oi.snaps[0]), soid);
+      t.remove(coll_t::build_snap_pg_coll(info.pgid, soid.snap), soid);
+    }
+  }
+}
 
 /** clean_up_local
  * remove any objects that we're storing but shouldn't.
@@ -3890,7 +3905,7 @@ void ReplicatedPG::clean_up_local(ObjectStore::Transaction& t)
         if (s.count(p->soid)) {
           dout(10) << " deleting " << p->soid
                    << " when " << p->version << dendl;
-          t.remove(coll_t::build_pg_coll(info.pgid), p->soid);
+         remove_object_with_snap_hardlinks(t, p->soid);
         }
         s.erase(p->soid);
       } else {
@@ -3903,7 +3918,7 @@ void ReplicatedPG::clean_up_local(ObjectStore::Transaction& t)
          i != s.end();
          i++) {
       dout(10) << " deleting stray " << *i << dendl;
-      t.remove(coll_t::build_pg_coll(info.pgid), *i);
+      remove_object_with_snap_hardlinks(t, *i);
     }
 
   } else {
@@ -3918,7 +3933,7 @@ void ReplicatedPG::clean_up_local(ObjectStore::Transaction& t)
       if (p->is_delete()) {
         dout(10) << " deleting " << p->soid
                  << " when " << p->version << dendl;
-        t.remove(coll_t::build_pg_coll(info.pgid), p->soid);
+       remove_object_with_snap_hardlinks(t, p->soid);
       } else {
         // keep old(+missing) objects, just for kicks.
       }
index e8596adc20515dd6cac87c0def16ea0e873c59f6..d5e1b21ead73ee011fbe5c8182c4a9fd7055a0b6 100644 (file)
@@ -491,6 +491,7 @@ protected:
   void log_op(vector<Log::Entry>& log, eversion_t trim_to, ObjectStore::Transaction& t);
   
   // pg on-disk content
+  void remove_object_with_snap_hardlinks(ObjectStore::Transaction& t, const sobject_t& soid);
   void clean_up_local(ObjectStore::Transaction& t);
 
   void _clear_recovery_state();