]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
OSD: handle stray snap collections from upgrade bug
authorSamuel Just <sam.just@inktank.com>
Tue, 7 May 2013 23:41:22 +0000 (16:41 -0700)
committerSamuel Just <sam.just@inktank.com>
Wed, 8 May 2013 18:15:45 +0000 (11:15 -0700)
Previously, we failed to clear snap_collections, which causes split to
spawn a bunch of snap collections.  In load_pgs, we now clear any such
snap collections and then snap_collections field on the PG itself.

Related: #4927
Signed-off-by: Samuel Just <sam.just@inktank.com>
Reviewed-by: Sage Weil <sage@inktank.com>
(cherry picked from commit 8e89db89cb36a217fd97cbc1f24fd643b62400dc)

src/osd/OSD.cc

index c2a7a61b68a7ddc4609497233e32974a2f5ec3f9..cba3f6c0b16c3c37f86b5157bfbe266b2ab4ecb5 100644 (file)
@@ -1775,8 +1775,29 @@ void OSD::load_pgs()
       dout(10) << "PG " << pg->info.pgid
               << " must upgrade..." << dendl;
       pg->upgrade(store, i->second);
-    } else {
-      assert(i->second.empty());
+    } else if (!i->second.empty()) {
+      // handle upgrade bug
+      for (interval_set<snapid_t>::iterator j = i->second.begin();
+          j != i->second.end();
+          ++j) {
+       for (snapid_t k = j.get_start();
+            k != j.get_start() + j.get_len();
+            ++k) {
+         assert(store->collection_empty(coll_t(pgid, k)));
+         ObjectStore::Transaction t;
+         t.remove_collection(coll_t(pgid, k));
+         store->apply_transaction(t);
+       }
+      }
+    }
+
+    if (!pg->snap_collections.empty()) {
+      pg->snap_collections.clear();
+      pg->dirty_big_info = true;
+      pg->dirty_info = true;
+      ObjectStore::Transaction t;
+      pg->write_if_dirty(t);
+      store->apply_transaction(t);
     }
 
     service.init_splits_between(pg->info.pgid, pg->get_osdmap(), osdmap);